Vous êtes sur la page 1sur 16

Drcursivation

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)

 Lalgorithme P est une version drcursive de


lalgorithme P.

Rcursivit non terminale


 Ici, pour pouvoir drcursiver il va falloir drcursiver,
sauvegarder le contexte de lappel rcursif, typiquement les paramtres de lappel engendrant lappel rcursif.

 Originellement, lalgorithme est :


ALGORITHME Q(U) si C(U) alors D(U);Q(E(U));F(U) sinon T(U)

Rcursivit non terminale


Utilisation de piles  Aprs drcursivation on obtiendra donc :
ALGORITHME Q(U) empiler(nouvel_appel, U) tant que pile non vide faire dpiler(tat, V) si tat = nouvel_appel alors U n V si C(U) alors D(U) empiler(fin, U) empiler(nouvel_appel, E(U)) sinon T(U) si tat = fin alors U n V F(U)

Illustration de la drcursivation de lalgorithme Q


 Exemple dexcution de Q :
Appel Q(U0) C(U0) vrai D(U0) Appel Q(E(U0)) C(E(U0)) vrai D(E(U0)) Appel Q(E(E(U0))) C(E(E(U0))) faux T(E(E(U0))) F(E(U0)) F(U0)

Exemple dexcution de lalgorithme drcursiv.


 Appel Q(U0)
empiler(nouvel_appel, U)) pile = [(nouvel_appel, U0)] dpiler(tat, V)) tat n nouvel_appel ; V n U0 ; pile = [] U n U0 C(U0) vrai D(U0) empiler(fin, U)) pile = [(fin, U0)] empiler(nouvel_appel, E(U))) pile = [(fin, U0) ; (nouvel_appel, E(U0))]

Exemple dexcution de lalgorithme drcursiv.


dpiler(tat, V)) tat n nouvel_appel ; V n E(U0) ; pile = [(fin, U0)] U n E(U0) C(E(U0)) vrai D(E(U0)) empiler(fin, U)) pile = [(fin, U0) ; (fin, E(U0))] empiler(nouvel_appel, E(U))) pile = [(fin, U0) ; (fin, E(U0)) ; (nouvel_appel, E(E(U0)))]

Exemple dexcution de lalgorithme drcursiv.


dpiler(tat, V)) tat n nouvel_appel ; V n E(E(U0)) ; pile = [(fin, U0) ; (fin, E(U0))] U n E(E(U0)) C(E(E(U0))) faux T(E(E(U0))) dpiler(tat, V)) tat fin ; V n E(U0) ; pile = [(fin, U0)] F(E(U0)) dpiler(tat, V)) tat n fin ; V n U0 ; pile = [] F(U0)

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.

ALGORITHME Q(U) Exemple 1 si C(U) alors D(U);Q(E(U));F(U)

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

ALGORITHME P(U) si C(U) alors D(U);P(E(U)) sinon T(U)

ALGORITHME P(U) tant que C(U) faire D(U);U n E(U) T(U)

U = a, C(U)= a<>nil, D(U) = {parcoursInfixe(a^.fg) , ecrire(a^.info)}, E(U)= a^.fd, T(U) = vide

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

Autre forme de rcurisivit non terminale


Procdure Pi (U) Procdure Pr (U) dbut tantque C(U) faire D(U) Pr(E(U)) F(U) fin tantque fin dbut initPileVide tantque C(U) ou not pileVide faire tantque C(U) faire D(U) empiler(U) U:= E(U) fin tant que depiler (U) F(U) fin tantque fin

Vous aimerez peut-être aussi