← algo
TD 3 · Algorithmique II

La récursivité

Une fonction qui s'appelle elle-même. Le secret tient en deux ingrédients : un cas de base qui arrête la descente, et un appel récursif qui s'en rapproche. Regardez la pile d'appels grandir puis se résorber.

Exercice 1
★★

Réécriture récursive

La somme 1 + 2 + … + n et la pile d'appels

Énoncé

Réécrire sous forme récursive (et terminale quand c'est possible) des algorithmes itératifs — ici la somme des entiers de 1 à n.

Pile d'appels (descente puis remontée)
somme(4)
01 / 10
somme(4) attend d'abord somme(3) — on descend
somme(n) = 1 + 2 + … + n
1Fonction somme(n) : entier
2 Si n = 0 alors
3 Retourner 0
4 Sinon
5 Retourner n + somme(n-1)
6FIN
Forme récursive terminale
1Fonction sommeT(n, acc) : entier
2 Si n = 0 alors Retourner acc
3 Retourner sommeT(n-1, acc+n)

En transportant le résultat dans acc, l'appel récursif est la dernière opération : plus rien à faire en remontant.

À retenir

La descente empile les appels jusqu'au cas de base ; la remontée combine les résultats. La forme terminale (avec accumulateur) évite ce travail au retour.

Exercice 2
★★★

Fibonacci & les lapins

L'arbre d'appels exponentiel

Énoncé

Un couple de lapins engendre un nouveau couple chaque mois dès son deuxième mois. Exprimer la population du mois n, la calculer (itératif & récursif), et trouver quand elle dépasse 300.

Arbre des appels de fib(5)
543210121032101
01 / 15
appel n° 1 : fib(5) = fib(4) + fib(3)
Fibonacci récursif
1Fonction fib(n) : entier
2 Si n ≤ 1 alors
3 Retourner n
4 Sinon
5 Retourner fib(n-1) + fib(n-2)
6FIN
fib(5)
5
appels totaux
15

Remarquez la redondance : fib(2) est recalculé plusieurs fois. Le nombre d'appels explose — c'est pourquoi la version itérative est préférée en pratique.

La suite des lapins (version itérative)
1
1
1
2
2
3
3
4
5
5
8
6
13
7
21
8
34
9
55
10
89
11
144
12
233
13
377
14

couplesn = couplesn−1 + couplesn−2 · au mois 12 → 144 couples · la population dépasse 300 au mois 14 (377).

À retenir

La relation fib(n) = fib(n-1) + fib(n-2) se traduit en un arbre binaire d'appels. Sa taille croît exponentiellement, d'où l'intérêt de la version itérative pour les grandes valeurs.

Exercice 3
★★

PGCD & conversion binaire

Euclide et l'affichage au retour

Énoncé

Écrire récursivement le PGCD de deux nombres, puis la conversion d'un décimal en binaire.

aba mod b
01 / 08
pgcd(48, 18) : b ≠ 0 → on continue
PGCD d'Euclide
1Fonction pgcd(a, b) : entier
2 Si b = 0 alors
3 Retourner a
4 Sinon
5 Retourner pgcd(b, a mod b)
6FIN
À retenir

Euclide repose sur pgcd(a, b) = pgcd(b, a mod b) avec le cas de base b = 0. Pour le binaire, écrire après l'appel récursif produit les bits dans le bon ordre.