Vous êtes sur la page 1sur 14

1 de 1

Algorithmique

Rcursivit
Florent Hivert
Ml : Florent.Hivert@lri.fr Adresse universelle : http://www.lri.fr/hivert

2 de 1

Rcursivit et Rcurrence
Deux notions trs proche : mathmatiques : rcurrence informatique : rcursivit De nombreuses dnitions mathmatiques sont rcursives :

Dnition (Peano)
0 est un entier naturel. Tout entier n a un successeur unique Sn (= n + 1) ; Tout entier sauf 0 est le successeur dun unique entier ; Pour tout nonc P(n) si P(0) est vrai et si pour tout n, P(n) implique P(Sn) alors lnonc n : P(n) est vrai.

3 de 1

Dnition
Moyen simple et lgant de rsoudre certain problme.

Dnition
On appelle rcursive toute fonction ou procdure qui sappelle elle mme. Algorithme Fact Entre : un entier positif N Sortie : factorielle de N si N = 0 retourner 1 sinon retourner N x Fact(N-1)

4 de 1

Exemple dans un vrai langage de programmation

unsigned int fact(unsigned int N) { if (N == 0) return 1; else return N*fact(N-1); }

4 de 1

Exemple dans un vrai langage de programmation

unsigned int fact(unsigned int N) { if (N == 0) return 1; else return N*fact(N-1); }

a marche ! ! !

5 de 1

Comment a marche ?
Appel fact(4) . 4*fact(3) = ? . Appel fact(3) . . 3*fact(2) = ? . . Appel fact(2) . . . 2*fact(1) = ? . . . Appel fact(1) . . . . 1*fact(0) = ? . . . . Appel fact(0) . . . . Retour de la valeur 1 . . . . 1*1 . . . Retour de la valeur 1 . . . 2*1 . . Retour de la valeur 2 . . 3*2 . Retour de la valeur 6 . 4*6 Retour de la valeur 24

6 de 1

Notion de pile dexcution

Dnition (Pile dexcution)


La Pile dexcution du programme en cours est un emplacement mmoire destiner mmoriser les paramtres, les variables locales ainsi que les adresses de retour des fonctions en cours dexcution. Elle fonctionne selon le principe LIFO (Last-In-First-Out) : dernier entr premier sorti. Attention ! La pile une taille xe, une mauvaise utilisation de la rcursivit peut entraner un dbordement de pile.

6 de 1

Notion de pile dexcution

Dnition (Pile dexcution)


La Pile dexcution du programme en cours est un emplacement mmoire destiner mmoriser les paramtres, les variables locales ainsi que les adresses de retour des fonctions en cours dexcution. Elle fonctionne selon le principe LIFO (Last-In-First-Out) : dernier entr premier sorti. Attention ! La pile une taille xe, une mauvaise utilisation de la rcursivit peut entraner un dbordement de pile.

6 de 1

Notion de pile dexcution

Dnition (Pile dexcution)


La Pile dexcution du programme en cours est un emplacement mmoire destiner mmoriser les paramtres, les variables locales ainsi que les adresses de retour des fonctions en cours dexcution. Elle fonctionne selon le principe LIFO (Last-In-First-Out) : dernier entr premier sorti. Attention ! La pile une taille xe, une mauvaise utilisation de la rcursivit peut entraner un dbordement de pile.

7 de 1

Point terminal

Retenir
Comme dans le cas dune boucle, il faut un cas darrt o lon ne fait pas dappel rcursif. procdure rcursive(paramtres): si TEST_DARRET: instructions du point darrt sinon instructions rcursive(paramtres changs); instructions

// appel rcursif

8 de 1

La rcursivit terminale
Dnition
On dit quun fonction est rcursive terminale, si tout appel rcursif est de la forme return f(...) Autrement dit, la valeur retourne est directement la valeur obtenue par un appel rcursif, sans quil ny ait aucune opration sur cette valeur. Il ny a ainsi rien retenir sur la pile. Entre : Entiers positifs n, a Sortie : a*n! si n == 0 retourner a sinon retourner Algo(n-1,n*a)

8 de 1

La rcursivit terminale
Dnition
On dit quun fonction est rcursive terminale, si tout appel rcursif est de la forme return f(...) Autrement dit, la valeur retourne est directement la valeur obtenue par un appel rcursif, sans quil ny ait aucune opration sur cette valeur. Il ny a ainsi rien retenir sur la pile. Entre : Entiers positifs n, a Sortie : a*n! si n == 0 retourner a sinon retourner Algo(n-1,n*a)

9 de 1

La rcursivit terminale (2)


Ide : Il ny a rien retenir sur la pile.

Retenir
Quand une fonction est rcursive terminale, on peut transformer lappelle rcursif en une boucle, sans utilisation de mmoire supplmentaire. Attention ! cette optimisation nest pas supporte par tous les compilateurs et est optionnelle (ex : -O3 avec gcc). si n == 0 retourner a sinon retourner Algo(n-1,n*a) Devient : Tant que n <> 0: a <- n*a; n <- n-1 retourner a

9 de 1

La rcursivit terminale (2)


Ide : Il ny a rien retenir sur la pile.

Retenir
Quand une fonction est rcursive terminale, on peut transformer lappelle rcursif en une boucle, sans utilisation de mmoire supplmentaire. Attention ! cette optimisation nest pas supporte par tous les compilateurs et est optionnelle (ex : -O3 avec gcc). si n == 0 retourner a sinon retourner Algo(n-1,n*a) Devient : Tant que n <> 0: a <- n*a; n <- n-1 retourner a