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, c’est transformer un algorithme récursif en un algorithme équivalent ne contenant pas d’appels récursifs. Récursivité terminale.

Présentations similaires


Présentation au sujet: "Dérécursivation Dérécursiver, c’est transformer un algorithme récursif en un algorithme équivalent ne contenant pas d’appels récursifs. Récursivité terminale."— Transcription de la présentation:

1 Dérécursivation Dérécursiver, c’est transformer un algorithme récursif en un algorithme équivalent ne contenant pas d’appels récursifs. Récursivité terminale Définition Un algorithme est dit récursif terminal s’il 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(a(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 l’algorithme (dépendant de U) ; – a(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, l’algorithme P équivaut à l’algorithme suivant : ALGORITHME P’(U) tant que C(U) faire D(U);U  a(U) T(U) L’algorithme P’ est une version dérécursivée de l’algorithme P.

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

5 Récursivité non terminale
Utilisation de piles 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, a(U)) sinon T(U) si état = fin alors U  V F(U)

6 Illustration de la dérécursivation de l’algorithme Q
Exemple d’exécution de Q : Appel Q(U0) C(U0) vrai D(U0) Appel Q(a(U0)) C(a(U0)) vrai D(a(U0)) Appel Q(a(a(U0))) C(a(a(U0))) faux T(a(a(U0))) F(a(U0)) F(U0)

7 Exemple d’exécution de l’algorithme 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, a(U))) pile = [(fin, U0) ; (nouvel_appel, a(U0))]

8 Exemple d’exécution de l’algorithme dérécursivé.
dépiler(état, V)) état  nouvel_appel ; V  a(U0) ; pile = [(fin, U0)] U  a(U0) C(a(U0)) vrai D(a(U0)) empiler(fin, U)) pile = [(fin, U0) ; (fin, a(U0))] empiler(nouvel_appel, a(U))) pile = [(fin, U0) ; (fin, a(U0)) ; (nouvel_appel, a(a(U0)))]

9 Exemple d’exécution de l’algorithme dérécursivé.
dépiler(état, V)) état  nouvel_appel ; V  a(a(U0)) ; pile = [(fin, U0) ; (fin, a(U0))] U  a(a(U0)) C(a(a(U0))) faux T(a(a(U0))) état fin ; V  a(U0) ; pile = [(fin, U0)] F(a(U0)) é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 n’engendrent 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 U = a, C(U) = a<>nil, D(U) = vide a(U) = a^.suivant,
ALGORITHME Q(U) si C(U) alors D(U);Q(a(U));F(U) sinon T(U) Exemple 1 Procedure ParcoursListe(a U  :liste)  Debut si(a<>nil) C(U) alors begin Q(a(U)); ParcoursListe(a^.suivant) ; F(U) Ecrire(a^.info) End fsi fin U = a, C(U) = a<>nil, D(U) = vide a(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 U = a, C(U)= a<>nil,
ALGORITHME P(U) si C(U) alors D(U);P(a(U)) sinon T(U) procedure parcoursInfixe(a :Arbre) debut si (a<>nil) parcoursInfixe(a^.fg) ecrire(a^.info) parcoursInfixe(a^.fd) fsi fin ALGORITHME P’(U) tant que C(U) faire D(U);U  a(U) T(U) U = a, C(U)= a<>nil, D(U) = {parcoursInfixe(a^.fg) , ecrire(a^.info)}, a(U)= a^.fd, T(U) = vide

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(a(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 fintantque

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


Télécharger ppt "Dérécursivation Dérécursiver, c’est transformer un algorithme récursif en un algorithme équivalent ne contenant pas d’appels récursifs. Récursivité terminale."

Présentations similaires


Annonces Google