Exercice 1 (4 points) — dans l’esprit des principales 2018, 2022 et 2026 et du contrôle 2019, section Sciences de l’informatique
Soit l’algorithme de la fonction récursive Inconnue suivant, dont le type de retour n’est pas précisé :
Fonction Inconnue (x, y : Entier) : ……………
DEBUT
Si y = 0 Alors
Retourner 0
Sinon
r ← Inconnue(x, y Div 2)
Si y Mod 2 = 0 Alors
Retourner r + r
Sinon
Retourner r + r + x
FinSi
FinSi
FINNB : x et y sont deux entiers positifs ou nuls.
Travail demandé :
- Réécrire l’entête de la fonction Inconnue en complétant son type de retour. Justifier.
- La condition d’arrêt du traitement récursif est : a)
Retourner 0— b)y = 0— c)y Mod 2 = 0. Choisir la bonne réponse et justifier ce choix. - Justifier que, pour tout entier y positif ou nul, les appels récursifs successifs finissent par vérifier la condition d’arrêt.
- Donner la trace d’exécution de la fonction Inconnue — appels successifs, puis valeurs retournées en remontant — pour chacun des deux cas suivants :
- Cas 1 : x = 6 et y = 11.
- Cas 2 : x = 15 et y = 8.
- Dresser le tableau de déclaration des objets locaux de la fonction Inconnue.
- En déduire le rôle de la fonction Inconnue.
- Écrire l’algorithme d’une fonction itérative Produit(x, y) qui retourne le même résultat que Inconnue(x, y) sans aucun appel récursif, en n’utilisant, comme Inconnue, que des additions et les opérations Div 2 et Mod 2. Dresser son tableau de déclaration des objets locaux.
Voir la correction commentéeAprès avoir posé votre démarche
1. Idée : le type de retour se lit sur ce que retournent toutes les branches, pas sur le nom de la fonction. Inconnue retourne soit 0, soit r + r, soit r + r + x, où x est un entier et où r reçoit lui-même un résultat de Inconnue : ce sont toujours des entiers, le type de retour est . Entête complété :
Fonction Inconnue (x, y : Entier) : Entier2. Réponse b). y = 0 est le test qui arrête les appels : quand il est vrai, la fonction retourne 0 sans s’appeler elle-même. Retourner 0 est le traitement du cas d’arrêt, pas la condition ; y Mod 2 = 0 choisit seulement la formule appliquée après le retour de l’appel récursif.
3. Idée : nommer la grandeur qui décroît. Chaque appel récursif porte sur y Div 2. Pour y ≥ 1, on a 0 ≤ y Div 2 ≤ y / 2 < y : y reste un entier positif ou nul et diminue strictement d’un appel au suivant, il atteint donc 0 après un nombre fini d’appels. Pour y = 11 : 11 → 5 → 2 → 1 → 0, soit 5 appels, cas d’arrêt compris.
4.a Idée : descendre jusqu’au cas d’arrêt en notant la parité de y, puis remonter — chaque appel attend r, la valeur retournée par l’appel de la ligne du dessous. Cas 1 (x = 6, y = 11) : les appels se lisent de haut en bas, les valeurs se calculent de bas en haut.
| Appel | y Mod 2 | r reçu | Valeur retournée |
|---|---|---|---|
| Inconnue(6, 11) | 1 | 30 | 30 + 30 + 6 = 66 |
| Inconnue(6, 5) | 1 | 12 | 12 + 12 + 6 = 30 |
| Inconnue(6, 2) | 0 | 6 | 6 + 6 = 12 |
| Inconnue(6, 1) | 1 | 0 | 0 + 0 + 6 = 6 |
| Inconnue(6, 0) | — | — | 0 (cas d’arrêt) |
On retourne donc pour l’appel Inconnue(6, 11).
4.b Cas 2 (x = 15, y = 8) : y = 8, 4 et 2 sont pairs, seul y = 1 est impair.
| Appel | y Mod 2 | r reçu | Valeur retournée |
|---|---|---|---|
| Inconnue(15, 8) | 0 | 60 | 60 + 60 = 120 |
| Inconnue(15, 4) | 0 | 30 | 30 + 30 = 60 |
| Inconnue(15, 2) | 0 | 15 | 15 + 15 = 30 |
| Inconnue(15, 1) | 1 | 0 | 0 + 0 + 15 = 15 |
| Inconnue(15, 0) | — | — | 0 (cas d’arrêt) |
On retourne pour l’appel Inconnue(15, 8).
5. Tableau de déclaration des objets locaux de Inconnue :
| Objet | Type/Nature | Rôle |
|---|---|---|
| r | Entier | Résultat de l’appel récursif Inconnue(x, y Div 2) |
x et y sont les paramètres formels, déjà déclarés dans l’entête : ils ne figurent pas dans ce tableau.
6. Idée : comparer les résultats aux arguments. 66 = 6 × 11 et 120 = 15 × 8 : la fonction Inconnue permet de calculer le produit x × y par doublements successifs. En écrivant y = 2q + b, avec q = y Div 2 et b = y Mod 2, on a x × y = 2 × (x × q) + b × x : r vaut x × q, la fonction le double (r + r) et ajoute x lorsque y est impair. Chaque x ajouté est ensuite doublé par tous les appels du dessus, d’où, pour y = 11 : 6 × 11 = 6 × 8 + 6 × 2 + 6 × 1.
7. Idée : la boucle Tant que remplace les appels — même grandeur décroissante y, même arrêt quand y vaut 0. Comme il n’y a plus de remontée pour doubler le résultat, on double x à chaque tour et on accumule les x retenus dans p, initialisé à la valeur du cas d’arrêt, 0.
Fonction Produit (x, y : Entier) : Entier
DEBUT
p ← 0
Tant que y > 0 Faire
Si y Mod 2 = 1 Alors
p ← p + x
FinSi
x ← x + x
y ← y Div 2
Fin Tant que
Retourner p
FIN| Objet | Type/Nature | Rôle |
|---|---|---|
| p | Entier | Produit partiel accumulé |
Contrôle sur x = 6 et y = 11, une ligne par tour de boucle :
| Tour | y Mod 2 | p | x | y |
|---|---|---|---|---|
| départ | — | 0 | 6 | 11 |
| 1 | 1 | 6 | 12 | 5 |
| 2 | 1 | 18 | 24 | 2 |
| 3 | 0 | 18 | 48 | 1 |
| 4 | 1 | 66 | 96 | 0 |
La boucle s’arrête sur y = 0 avec p = 66, la valeur de Inconnue(6, 11). x et y étant passés par valeur, les modifier dans Produit ne change pas les objets du programme appelant.