D - PowerPoint PPT Presentation

About This Presentation
Title:

D

Description:

si C(U) alors D(U) empiler(fin, U) empiler(nouvel_appel, a(U)) sinon ... si a nil alors. empiler(fin, a) empiler(nouvel_appel,a^.suivant) fisi ... – PowerPoint PPT presentation

Number of Views:56
Avg rating:3.0/5.0
Slides: 17
Provided by: cril
Category:
Tags: alors

less

Transcript and Presenter's Notes

Title: D


1
Dé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.

2
Récursivité terminale
  • Exemple
  • ALGORITHME P(U)
  • si C(U)
  • alors
  • D(U)P(a(U))
  • sinon T(U)
  • 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).

3
Ré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.

4
Ré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)

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
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)

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, a(U)))
  • pile (fin, U0) (nouvel_appel, a(U0))

8
Exemple 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)))

9
Exemple 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)

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(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
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 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
13
ALGORITHME 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
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 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
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
Write a Comment
User Comments (0)
About PowerShow.com