Drcursiver, Drcursiver cest transformer un algorithme rcursif en un algorithme quivalent ne contenant pas dappels rcursifs.
Rcursivit terminale
Dfinition Un algorithme est dit rcursif terminal sil ne contient aucun traitement aprs un appel rcursif.
Rcursivit terminale
Exemple : ALGORITHME P(U)
si C(U) alors D(U);P(E(U)) sinon T(U)
o :
U est la liste des paramtres ; C(U) est une condition portant sur U ; D(U) est le traitement de base de lalgorithme (dpendant de U) ; E(U) reprsente la transformation des paramtres ; T(U) est le traitement de terminaison (dpendant de U).
Rcursivit terminale
Avec ces notations, lalgorithme P quivaut
lalgorithme suivant : ALGORITHME P(U)
tant que C(U) faire D(U);U n E(U) T(U)
Drcursivation
Remarques
Les programmes itratifs sont souvent plus efficaces, mais les programmes rcursifs sont plus faciles crire. Les compilateurs savent, la plupart du temps, reconnatre les appels rcursifs terminaux, et ceux-ci nengendrent pas de surcot par rapport la version itrative du mme programme. Il est toujours possible de drcursiver un algorithme rcursif.
Procedure ParcoursListe(a U :liste) sinon T(U) Debut si(a<>nil) C(U) alors begin Q(E(U)); ParcoursListe(a^.suivant) ; F(U) Ecrire(a^.info) End fsi fin
U = a, C(U) = a<>nil, D(U) = vide E(U) = a^.suivant, F(U) = ecrire(a^.info), T(U)= vide
Procedure parcoursListe (a :Liste) var p: Liste etat : (nouvel_appel, fin) debut empiler(nouvel_appel, a) tant que pile non vide faire dpiler(tat, p) si tat = nouvel_appel alors a n p si a<>nil alors empiler(fin, a) empiler(nouvel_appel,a^.suivant) fisi fsi si tat = fin alors a n p ecrire(a^.info) fsi ftantque fin
procedure parcoursInfixe(a :Arbre) debut si (a<>nil) parcoursInfixe(a^.fg) ecrire(a^.info) parcoursInfixe(a^.fd) fsi fin
Procedure ParcoursInfixe(a :Arbre) debut Tantque (a<>nil) faire ParcoursInfixe(a^.fg) Ecrire(a^.info) a n a^.fd fintantque fin
ALGORITHME Q(U) si C(U) alors D(U);Q(E(U));F(U) sinon T(U) U = a , C(U) = a<>nil, D(U) = vide, a(U)=a^.fg, F(U) ={ecrire(a^.info), a=a^.fd} , T(U) =vide
Procedure parcoursInfixe(a :Arbre) empiler(nouvel_appel, a) tant que pile non vide faire dpiler(tat, V) si tat = nouvel_appel alors a n V si a<>nil alors empiler(fin, a) empiler(nouvel_appel, a^.fg) fsi fsi si tat = fin alors a n V ecrire(a^.info) ana^.fd empiler(nouvel_appel, a) fsi fintantque