La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Dérécursivation Dérécursiver Dérécursiver, cest transformer un algorithme récursif en un algorithme équivalent ne contenant pas dappels récursifs. Récursivité

Présentations similaires


Présentation au sujet: "Dérécursivation Dérécursiver Dérécursiver, cest transformer un algorithme récursif en un algorithme équivalent ne contenant pas dappels récursifs. Récursivité"— Transcription de la présentation:

1 Dérécursivation Dérécursiver Dérécursiver, cest transformer un algorithme récursif en un algorithme équivalent ne contenant pas dappels récursifs. Récursivité terminale récursif terminal Définition Un algorithme est dit récursif terminal sil ne contient aucun traitement après un appel récursif.

2 Récursivité terminale Exemple : ALGORITHME P(U) si C(U) alors D(U);P ( ( U )) sinon T(U) où : – U est la liste des paramètres ; – C(U) est une condition portant sur U ; – D(U) est le traitement de base de lalgorithme (dépendant de U) ; – ( U ) représente la transformation des paramètres ; – T(U) est le traitement de terminaison (dépendant de U).

3 Récursivité terminale Avec ces notations, lalgorithme P équivaut à lalgorithme suivant : ALGORITHME P(U) tant que C(U) faire D(U);U ( U ) T(U) Lalgorithme P est une version dérécursivée de lalgorithme P.

4 Récursivité non terminale pour pouvoir dérécursiver sauvegarder le contexte Ici, pour pouvoir dérécursiver, il va falloir sauvegarder le contexte de lappel récursif, typiquement les paramètres de lappel engendrant lappel récursif. Originellement, lalgorithme est : ALGORITHME Q(U) si C ( U ) alors D ( U ) ;Q ( ( U )) ;F ( U ) sinon T ( U )

5 Récursivité non terminale Utilisation de piles dérécursivation Après dérécursivation on obtiendra donc : ALGORITHME Q(U) empiler(nouvel_appel, U) tant que pile non vide faire dépiler(état, V) si état = nouvel_appel alors U V si C ( U ) alors D ( U ) empiler(fin, U) empiler(nouvel_appel, ( U ) ) sinon T ( U ) si état = fin alors U V F ( U )

6 Illustration de la dérécursivation de lalgorithme Q Exemple dexécution de Q : Appel Q(U0) C ( U0 ) vrai D ( U0 ) Appel Q( ( U0 ) ) C ( ( U0 )) vrai D ( ( U0 )) Appel Q( ( ( U0 )) ) C ( ( ( U0 ))) faux T ( ( ( U0 ))) F ( ( U0 )) F ( U0 )

7 Exemple dexécution de lalgorithme dérécursivé. Appel Q(U0) empiler(nouvel_appel, U)) pile = [(nouvel_appel, U0)] dépiler(état, V)) état nouvel_appel ; V U0 ; pile = [] U U0 C ( U0 ) vrai D ( U0 ) empiler(fin, U)) pile = [(fin, U0)] empiler(nouvel_appel, ( U ) )) pile = [(fin, U0) ; (nouvel_appel, ( U0 ) )]

8 Exemple dexécution de lalgorithme dérécursivé. dépiler(état, V)) état nouvel_appel ; V ( U0 ) ; pile = [(fin, U0)] U ( U0 ) C ( ( U0 )) vrai D ( ( U0 )) empiler(fin, U)) pile = [(fin, U0) ; (fin, ( U0 ) )] empiler(nouvel_appel, ( U ) )) pile = [(fin, U0) ; (fin, ( U0 ) ) ; (nouvel_appel, ( ( U0 )) )]

9 Exemple dexécution de lalgorithme dérécursivé. dépiler(état, V)) état nouvel_appel ; V ( ( U0 )) ; pile = [(fin, U0) ; (fin, ( U0 ) )] U ( ( U0 )) C ( ( ( U0 ))) faux T ( ( ( U0 ))) dépiler(état, V)) état fin ; V ( U0 ) ; pile = [(fin, U0)] F ( ( U0 )) dépiler(état, V)) état fin ; V U0 ; pile = [] F ( U0 )

10 Dérécursivation Remarques Les programmes itératifs sont souvent plus efficaces, mais les programmes récursifs sont plus faciles à écrire. Les compilateurs savent, la plupart du temps, reconnaître les appels récursifs terminaux, et ceux-ci nengendrent pas de surcoût par rapport à la version itérative du même programme. Il est toujours possible de dérécursiver un algorithme récursif.

11 ALGORITHME Q(U) si C ( U ) alors D ( U ) ;Q ( ( U )) ;F ( U ) sinon T ( U ) Exemple 1 Procedure ParcoursListe(a U :liste) Debut si(a<>nil) C ( U ) alors begin Q ( ( U )) ; ParcoursListe(a^.suivant) ; F ( U ) Ecrire(a^.info) End fsi fin U = a, C(U) = a<>nil, D(U) = vide ( U) = a^.suivant, F(U) = ecrire(a^.info), T(U)= vide

12 Procedure parcoursListe (a :Liste) var p: Liste etat : (nouvel_appel, fin) debut empiler(nouvel_appel, a) tant que pile non vide faire dépiler(état, p) si état = nouvel_appel alors a p si a<>nil alors empiler(fin, a) empiler(nouvel_appel,a^.suivant) fisi fsi si état = fin alors a p ecrire(a^.info) fsi ftantque fin

13 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 ( ( U )) sinon T(U) U = a, C(U)= a<>nil, D(U) = {parcoursInfixe(a^.fg), ecrire(a^.info)}, (U)= a^.fd, T(U) = vide ALGORITHME P(U) tant que C(U) faire D(U);U ( U ) T(U)

14 Procedure ParcoursInfixe(a :Arbre) debut Tantque (a<>nil) faire ParcoursInfixe(a^.fg) Ecrire(a^.info) a a^.fd fintantque fin ALGORITHME Q(U) si C ( U ) alors D ( U ) ;Q ( ( 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

15 Procedure parcoursInfixe(a :Arbre) empiler(nouvel_appel, a) tant que pile non vide faire dépiler(état, V) si état = nouvel_appel alors a V si a<>nil alors empiler(fin, a) empiler(nouvel_appel, a^.fg) fsi si état = fin alors a V ecrire(a^.info) a a^.fd empiler(nouvel_appel, a) fsi fintantque

16 Autre forme de récurisivité non terminale Procédure Pr (U) début tantque C(U) faire D(U) Pr( (U)) F(U) fin tantque fin Procédure Pi (U) début initPileVide tantque C(U) ou not pileVide faire tantque C(U) faire D(U) empiler(U) U:= (U) fin tant que depiler (U) F(U) fin tantque fin


Télécharger ppt "Dérécursivation Dérécursiver Dérécursiver, cest transformer un algorithme récursif en un algorithme équivalent ne contenant pas dappels récursifs. Récursivité"

Présentations similaires


Annonces Google