Title: D
1Dérécursivation
- Dérécursiver, cest transformer un algorithme
récursif en un algorithme équivalent ne contenant
pas dappels récursifs. - Récursivité terminale
- Définition Un algorithme est dit récursif
terminal sil ne contient aucun traitement après
un appel récursif.
2Ré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 lalgorithme
(dépendant de U) - a(U) représente la transformation des
paramètres - T(U) est le traitement de terminaison
(dépendant de U).
3Récursivité terminale
- Avec ces notations, lalgorithme P équivaut à
lalgorithme suivant - ALGORITHME P(U)
- tant que C(U) faire D(U)U ? a(U)
- T(U)
-
- Lalgorithme P est une version dérécursivée de
lalgorithme P.
4Récursivité non terminale
- 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(a(U))F(U)
- sinon T(U)
5Ré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)
6Illustration de la dérécursivation de
lalgorithme Q
- Exemple dexé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)
7Exemple 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, a(U)))
- pile (fin, U0) (nouvel_appel, a(U0))
8Exemple dexécution de lalgorithme 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)))
9Exemple dexécution de lalgorithme 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)))
- dépiler(état, V))
- état fin V ? a(U0) pile (fin, U0)
- F(a(U0))
- dépiler(état, V))
- état ? fin V ? U0 pile
- F(U0)
10Dé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(a(U))F(U)
- sinon T(U)
Exemple 1 Procedure ParcoursListe(a U
liste) Debut si(altgtnil) C(U) alors begin
Q(a(U)) ParcoursListe(a.suivant) F(U)
Ecrire(a.info) End fsi fin
U a, C(U) altgtnil, D(U) vide a(U)
a.suivant, F(U) ecrire(a.info), T(U) vide
12Procedure 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 altgtnil alors
empiler(fin, a) empiler(nouvel_appel,a
.suivant) fisi fsi si état fin alors a ?
p ecrire(a.info) fsi ftantque fi
n
13ALGORITHME P(U) si C(U) alors D(U)P(a(U)) sino
n T(U)
- procedure parcoursInfixe(a Arbre)
- debut
- si (altgtnil)
- 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) altgtnil, D(U) parcoursInfixe(a.f
g) , ecrire(a.info), a(U) a.fd, T(U) vide
14- Procedure ParcoursInfixe(a Arbre)
- debut
- Tantque (altgtnil) 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) altgtnil, D(U) vide,
a(U)a.fg, F(U) ecrire(a.info), aa.fd ,
T(U) vide
15Procedure 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 altgtnil alors
empiler(fin, a) empiler(nouvel_appel,
a.fg) fsi fsi si état fin alors
a ? V ecrire(a.info) a?a.fd
empiler(nouvel_appel, a) fsi
fintantque
16Autre 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