Télécharger la présentation
Publié parLucille Gabriel Modifié depuis plus de 10 années
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) aa^.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
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.