Beruflich Dokumente
Kultur Dokumente
Un programme est dit rcursif s'il s'appelle lui mme (du latin recurrere = courir en arrire) Un programme rcursif est donc forcment une fonction ou une procdure (il doit pouvoir s'appeler) Exemple : la factorielle
version itrative : n! = 1 2 ... n
// cette fonction renvoie n! (n est suppos suprieur ou gal 1) fonction avec retour entier factorielle1(entier n) entier i, resultat; dbut resultat <- 1; pour (i allant de 2 n pas 1) faire resultat <- resultat*i; finpour retourne resultat; fin
Rcursivit (2/3)
version rcursive : 1! = 1 et, pour n > 1, n! = n * (n-1)!
// cette fonction renvoie n! (n est suppos suprieur ou gal 1) fonction avec retour entier factorielle2(entier n) dbut si (n = 1) alors retourne 1; sinon retourne n*factorielle2(n-1); finsi fin
Puisqu'une fonction rcursive s'appelle elle-mme, il est impratif qu'on prvoit une condition d'arrt la rcursion, sinon le programme ne s'arrte jamais! On doit toujours tester en premier la condition d'arrt, et ensuite, si la condition n'est pas vrifie lancer un appel rcursif
Rcursivit (3/3)
La rcursivit comme technique de programmation permet d'criture facilement et de faon trs lisible des programmes rptitifs compliqus
elle est trs puissante pour crire les algorithmes sur des structures complexes comme les arbres et les graphes elle est au coeur de certains langages, en particulier les langages fonctionnels (LISP, CAML, ...), la programmation logique (PROLOG)
La notion de rcursivit joue galement un grand rle en informatique thorique (thorie de la calculabilit, lambda-calcul, thorme de Gdel, ...) et en mathmatiques
appel rcursif
retour de la valeur
appel rcursif
Chaque appel de fonction provoque la sauvegarde d'un contexte d'excution dans la pile d'excution. Un contexte comprend :
l'adresse de l'instruction qui a appel la fonction les valeurs des paramtres d'appel l'adresse de la fonction appele
phase de descente
Dbordement de pile
public static void testPile(int nbAppels){ System.out.println("appel numro " + nbAppels); testPile(nbAppels + 1); }
Excution de fibo(4) :
fibo(4)
fonction avec retour ... recursive(P) si (ConditionArret) alors // instructions arret sinon // instructions recursive(f(P)); finsi fin
11
21
41
On peut crire des algorithmes o les appels rcursifs se croisent d'une fonction l'autre, c'est de la rcursivit croise Exemple : rcursivit croise entre deux fonctions
// cette fonction renvoie vrai si l'entier est pair, faux sinon // on suppose que l'entier est positif ou nul fonction avec retour boolen estPair(entier n) dbut si (m = 0) alors retourne VRAI; sinon retourne estImpair(n-1); finsi fin // cette fonction renvoie vrai si l'entier est impair, faux sinon // on suppose que l'entier est positif ou nul fonction avec retour boolen estImpair(entier n) dbut si (m = 0) alors retourne FAUX; sinon retourne estPair(n-1); finsi fin
Rcursivit croise