Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) :...

180
Cours d'algorithmique 7 - Cours d'algorithmique 7 - Intranet Intranet 1 27 novembre 2006 27 novembre 2006 Cours d’Algorithmique Cours d’Algorithmique Dérécursion (début) : Dérécursion (début) : Équivalences entre Équivalences entre programmes récursifs programmes récursifs et et programmes itératifs avec ou sans gestion programmes itératifs avec ou sans gestion de pile. de pile.

Transcript of Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) :...

Page 1: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 1127 novembre 200627 novembre 2006

Cours d’AlgorithmiqueCours d’Algorithmique

Dérécursion (début) :Dérécursion (début) :

Équivalences entreÉquivalences entre

programmes récursifsprogrammes récursifs

etet

programmes itératifs avec ou sans gestion de pile.programmes itératifs avec ou sans gestion de pile.

Page 2: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 22

• Trier et chercher, recherche textuelleTrier et chercher, recherche textuelle• Listes et arbresListes et arbres• Le back-trackLe back-track• Arbres équilibrésArbres équilibrés• Récursivité et induction sur la structureRécursivité et induction sur la structure• Divide and conquerDivide and conquer• Minimax, alpha-betaMinimax, alpha-beta• DérécursionDérécursion• Divers problèmes particuliersDivers problèmes particuliers• Logique de HoareLogique de Hoare• Programmation dynamiqueProgrammation dynamique• Complexité et calculabilitéComplexité et calculabilité

Les grandes lignes du coursLes grandes lignes du cours

Page 3: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 33

IntroductionIntroduction----------------------------------------------------------------------------------------------------------------------------------

• Si nous programmons à l’aide de fonctions récursives :Si nous programmons à l’aide de fonctions récursives :

– la gestion des différents appels est faite par le système,la gestion des différents appels est faite par le système,

– à travers la gestion de la pile.à travers la gestion de la pile.

Page 4: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 44

IntroductionIntroduction----------------------------------------------------------------------------------------------------------------------------------

• Si nous programmons à l’aide de fonctions récursives :Si nous programmons à l’aide de fonctions récursives :

– la gestion des différents appels est faite par le système,la gestion des différents appels est faite par le système,

– à travers la gestion de la pile.à travers la gestion de la pile.

• Si nous programmons de manière itérative (boucle Si nous programmons de manière itérative (boucle while) :while) :

– nous devons gérer nous-mêmes toutes les instances des nous devons gérer nous-mêmes toutes les instances des calculscalculs

– et donc gérer éventuellement une pile.et donc gérer éventuellement une pile.

Page 5: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 55

IntroductionIntroduction----------------------------------------------------------------------------------------------------------------------------------

• Si nous programmons à l’aide de fonctions récursives :Si nous programmons à l’aide de fonctions récursives :

– la gestion des différents appels est faite par le système,la gestion des différents appels est faite par le système,

– à travers la gestion de la pile.à travers la gestion de la pile.

• Si nous programmons de manière itérative (boucle Si nous programmons de manière itérative (boucle while) :while) :

– nous devons gérer nous-mêmes toutes les instances des nous devons gérer nous-mêmes toutes les instances des calculscalculs

– et donc gérer éventuellement une pile.et donc gérer éventuellement une pile.

• Questions :Questions :

– Comment passer du Comment passer du récursif à l’itératifrécursif à l’itératif et vice-versa ? et vice-versa ?

Page 6: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 66

IntroductionIntroduction----------------------------------------------------------------------------------------------------------------------------------

• Si nous programmons à l’aide de fonctions récursives :Si nous programmons à l’aide de fonctions récursives :

– la gestion des différents appels est faite par le système,la gestion des différents appels est faite par le système,

– à travers la gestion de la pile.à travers la gestion de la pile.

• Si nous programmons de manière itérative (boucle Si nous programmons de manière itérative (boucle while) :while) :

– nous devons gérer nous-mêmes toutes les instances des nous devons gérer nous-mêmes toutes les instances des calculscalculs

– et donc gérer éventuellement une pile.et donc gérer éventuellement une pile.

• Questions :Questions :

– Comment passer du Comment passer du récursif à l’itératifrécursif à l’itératif et vice-versa ? et vice-versa ?

Page 7: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 77

IntroductionIntroduction----------------------------------------------------------------------------------------------------------------------------------

• Si nous programmons à l’aide de fonctions récursives :Si nous programmons à l’aide de fonctions récursives :

– la gestion des différents appels est faite par le système,la gestion des différents appels est faite par le système,

– à travers la gestion de la pile.à travers la gestion de la pile.

• Si nous programmons de manière itérative (boucle while) :Si nous programmons de manière itérative (boucle while) :

– nous devons gérer nous-mêmes toutes les instances des calculsnous devons gérer nous-mêmes toutes les instances des calculs

– et donc gérer éventuellement une pile.et donc gérer éventuellement une pile.

• Questions :Questions :

– Comment passer du récursif à l’itératif et vice-versa ?Comment passer du récursif à l’itératif et vice-versa ?

– Et pourquoi on préfère souvent la récursion à l’itération . . .Et pourquoi on préfère souvent la récursion à l’itération . . .

Page 8: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 88

IntroductionIntroduction----------------------------------------------------------------------------------------------------------------------------------

• Si nous programmons à l’aide de fonctions récursives :Si nous programmons à l’aide de fonctions récursives :

– la gestion des différents appels est faite par le système,la gestion des différents appels est faite par le système,

– à travers la gestion de la pile.à travers la gestion de la pile.

• Si nous programmons de manière itérative (boucle while) :Si nous programmons de manière itérative (boucle while) :

– nous devons gérer nous-mêmes toutes les instances des calculsnous devons gérer nous-mêmes toutes les instances des calculs

– et donc gérer éventuellement une pile.et donc gérer éventuellement une pile.

• Questions :Questions :

– Comment passer du récursif à l’itératif et vice-versa ?Comment passer du récursif à l’itératif et vice-versa ?

– Et pourquoi on préfère souvent la récursion à l’itération . . .Et pourquoi on préfère souvent la récursion à l’itération . . .

Page 9: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 99

IntroductionIntroduction----------------------------------------------------------------------------------------------------------------------------------

• Si nous programmons à l’aide de fonctions récursives :Si nous programmons à l’aide de fonctions récursives :

– la gestion des différents appels est faite par le système,la gestion des différents appels est faite par le système,

– à travers la gestion de la pile.à travers la gestion de la pile.

• Si nous programmons de manière itérative (boucle while) :Si nous programmons de manière itérative (boucle while) :

– nous devons gérer nous-mêmes toutes les instances des calculsnous devons gérer nous-mêmes toutes les instances des calculs

– et donc gérer éventuellement une pile.et donc gérer éventuellement une pile.

• Questions :Questions :

– Comment passer du récursif à l’itératif et vice-versa ?Comment passer du récursif à l’itératif et vice-versa ?

– Et pourquoi on préfère souvent la récursion à l’itération . . .Et pourquoi on préfère souvent la récursion à l’itération . . .

Page 10: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 1010

Théorème fondamentalThéorème fondamental----------------------------------------------------------------------------------------------------------------------------------

• Tout programme qui comporte des itérations while et Tout programme qui comporte des itérations while et des fonctions récursives :des fonctions récursives :

– peut être transformé en un programme qui comporte peut être transformé en un programme qui comporte uniquement des fonctions récursives,uniquement des fonctions récursives,

Page 11: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 1111

Théorème fondamentalThéorème fondamental----------------------------------------------------------------------------------------------------------------------------------

• Tout programme qui comporte des itérations while et Tout programme qui comporte des itérations while et des fonctions récursives :des fonctions récursives :

– peut être transformé en un programme qui comporte peut être transformé en un programme qui comporte uniquement des fonctions récursives,uniquement des fonctions récursives,

• Tout programme qui comporte des itérations while et Tout programme qui comporte des itérations while et

des fonctions récursives :des fonctions récursives :

– peut être transformé en un programme qui comportepeut être transformé en un programme qui comporte uniquement des itérations while,uniquement des itérations while,

Page 12: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 1212

Théorème fondamentalThéorème fondamental----------------------------------------------------------------------------------------------------------------------------------

• Tout programme qui comporte des itérations while et Tout programme qui comporte des itérations while et des fonctions récursives :des fonctions récursives :

– peut être transformé en un programme qui comporte peut être transformé en un programme qui comporte uniquement des fonctions récursives,uniquement des fonctions récursives,

– et même une seule fonction récursive.et même une seule fonction récursive.

• Tout programme qui comporte des itérations while et Tout programme qui comporte des itérations while et des fonctions récursives :des fonctions récursives :

– peut être transformé en un programme qui comportepeut être transformé en un programme qui comporte uniquement des itérations while,uniquement des itérations while,

– et même une seule itération while.et même une seule itération while.

Page 13: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 1313

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

R é C u R s I fR é C u R s I f

V e R sV e R s

i T é R a T i F ! ! !i T é R a T i F ! ! !

Page 14: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 1414

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Page 15: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 1515

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Page 16: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 1616

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Chaque appel récursif engendre au plus un autre appel !Chaque appel récursif engendre au plus un autre appel !

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Page 17: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 1717

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Chaque appel récursif engendre au plus un autre appel !Chaque appel récursif engendre au plus un autre appel !

f ( x )f ( x ) = = if ( ... )if ( ... ) return( valeur )return( valeur ) elseelse return( ... return( ... f( )f( ) ... ) ... )

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Page 18: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 1818

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Chaque appel récursif engendre au plus un autre appel !Chaque appel récursif engendre au plus un autre appel !

f ( x )f ( x ) = = if ( ... )if ( ... ) return( valeur )return( valeur ) elseelse return( ... return( ... f( )f( ) ... ) ... )

f ( x )f ( x ) = = if ( ... )if ( ... ) return( valeur )return( valeur ) elseelse if ( ... )if ( ... ) return( ... return( ... f( )f( ) ... ) ... ) elseelse return( ... return( ... f( )f( ) ... ) ... )

mais aussi :mais aussi :

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Page 19: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 1919

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Chaque appel récursif engendre au plus deux autres appels !Chaque appel récursif engendre au plus deux autres appels !

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Page 20: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 2020

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Chaque appel récursif engendre au plus deux autres appels !Chaque appel récursif engendre au plus deux autres appels !

f ( x )f ( x ) = = if ( ... )if ( ... ) return( valeur )return( valeur ) elseelse if ( ... )if ( ... ) return( ... return( ... f( )f( ) ... ) ... ) elseelse return( ... return( ... f( )f( ) ... ... f( )f( ) ... ... ))

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Page 21: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 2121

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Page 22: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 2222

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

On dit que l’appel récursif est « terminal ».On dit que l’appel récursif est « terminal ».

Page 23: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 2323

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

On dit que l’appel récursif est « terminal ».On dit que l’appel récursif est « terminal ».

f ( x )f ( x ) = = if ( ... )if ( ... ) return( valeur )return( valeur ) elseelse return( return( f( ... )f( ... ) ) )

Page 24: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 2424

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

On dit que l’appel récursif est « non terminal ».On dit que l’appel récursif est « non terminal ».

Page 25: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 2525

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

On dit que l’appel récursif est « non terminal ».On dit que l’appel récursif est « non terminal ».

f ( x )f ( x ) = = if ( ... )if ( ... ) return( valeur )return( valeur ) elseelse return( return( h( ...h( ... f( ) f( ) ... )... ) ) )

La fonction « h »La fonction « h »est l’enveloppe !est l’enveloppe !

Page 26: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 2626

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOui

Page 27: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 2727

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOui

« h » est associative si, et seulement si, on a toujours :« h » est associative si, et seulement si, on a toujours :

h ( a , h ( b , c ) ) = h ( h ( a , b ) , c )h ( a , h ( b , c ) ) = h ( h ( a , b ) , c )

Page 28: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 2828

RemarqueRemarque----------------------------------------------------------------------------------------------------------------------------------

« h » est associative si, et seulement si, on a toujours :« h » est associative si, et seulement si, on a toujours :

h ( a , h ( b , c ) ) = h ( h ( a , b ) , c )h ( a , h ( b , c ) ) = h ( h ( a , b ) , c )

Page 29: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 2929

RemarqueRemarque----------------------------------------------------------------------------------------------------------------------------------

« h » est associative si, et seulement si, on a toujours :« h » est associative si, et seulement si, on a toujours :

h ( a , h ( b , c ) )h ( a , h ( b , c ) ) = h ( h ( a , b ) , c ) = h ( h ( a , b ) , c )

hh

aa hh

bb cc

Page 30: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 3030

RemarqueRemarque----------------------------------------------------------------------------------------------------------------------------------

« h » est associative si, et seulement si, on a toujours :« h » est associative si, et seulement si, on a toujours :

h ( a , h ( b , c ) )h ( a , h ( b , c ) ) = = h ( h ( a , b ) , c )h ( h ( a , b ) , c )

hh

aa hh

bb cc

hh

cchh

aa bb

Page 31: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 3131

RemarqueRemarque----------------------------------------------------------------------------------------------------------------------------------

« h » est associative si, et seulement si, on a toujours :« h » est associative si, et seulement si, on a toujours :

h ( a , h ( b , c ) )h ( a , h ( b , c ) ) = = h ( h ( a , b ) , c )h ( h ( a , b ) , c )

hh

aa hh

bb cc

hh

cchh

aa bb

==

Les structures des arbres n’importent pas !Les structures des arbres n’importent pas !

==

Page 32: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 3232

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

P R E S E N T A T I O P R E S E N T A T I O NN

G E N E R A L EG E N E R A L E

D E S C A SD E S C A S

D E F I G U R ED E F I G U R E

Page 33: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 3333

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOui

Page 34: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 3434

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOuiAvec élément neutreAvec élément neutre

NonNon OuiOui

Page 35: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 3535

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOuiAvec élément neutreAvec élément neutre

NonNon OuiOui

« h » admet le« h » admet leneutre « e » si, etneutre « e » si, etseulement si, on a toujours:seulement si, on a toujours:

h( e , a ) = a = h( a , e )h( e , a ) = a = h( a , e )

Page 36: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 3636

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOuiAvec élément neutreAvec élément neutre

NonNon OuiOui

Appréciations !Appréciations !

Page 37: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 3737

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOuiAvec élément neutreAvec élément neutre

NonNon OuiOui

Appréciations !Appréciations !

Sympas ! ! !Sympas ! ! !

Page 38: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 3838

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOuiAvec élément neutreAvec élément neutre

NonNon OuiOui

Appréciations !Appréciations !

Sympas ! ! !Sympas ! ! !

Assez sympa !Assez sympa !

Page 39: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 3939

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOuiAvec élément neutreAvec élément neutre

NonNon OuiOui

Appréciations !Appréciations !

Sympas ! ! !Sympas ! ! !

Assez sympa !Assez sympa !

Il existe desIl existe destransformations !transformations !

Page 40: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 4040

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOuiAvec élément neutreAvec élément neutre

NonNon OuiOui

Appréciations !Appréciations !

Sympas ! ! !Sympas ! ! !

Assez sympa !Assez sympa !

Il existe desIl existe destransformations !transformations !

Page 41: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 4141

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOuiAvec élément neutreAvec élément neutre

NonNon OuiOui

Appréciations !Appréciations !

Sympas ! ! !Sympas ! ! !

Assez sympa !Assez sympa !

Il existe desIl existe destransformations !transformations !

Page 42: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 4242

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOuiAvec élément neutreAvec élément neutre

NonNon OuiOui

Appréciations !Appréciations !

Sympas ! ! !Sympas ! ! !

Assez sympa !Assez sympa !

Beurk ! ! ! ! !Beurk ! ! ! ! !Il existe desIl existe destransformations !transformations !

Page 43: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 4343

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOuiAvec élément neutreAvec élément neutre

NonNon OuiOui

Appréciations !Appréciations !

Sympas ! ! !Sympas ! ! !

Assez sympa !Assez sympa !

Beurk ! ! ! ! !Beurk ! ! ! ! !Il existe desIl existe destransformations !transformations !

Page 44: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 4444

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOuiAvec élément neutreAvec élément neutre

NonNon OuiOui

Appréciations !Appréciations !

Sympas ! ! !Sympas ! ! !

Assez sympa !Assez sympa !

Beurk ! ! ! ! !Beurk ! ! ! ! !Il existe desIl existe destransformations !transformations !

Page 45: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 4545

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOui

Appréciations !Appréciations !

Itératif ! ! !Itératif ! ! !

Récursif ! ! !Récursif ! ! !

Page 46: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 4646

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Page 47: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 4747

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Page 48: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 4848

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Page 49: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 4949

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Page 50: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 5050

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeuxFonction auto-enveloppéeFonction auto-enveloppée

NonNon OuiOui

Page 51: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 5151

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeuxFonction auto-enveloppéeFonction auto-enveloppée

NonNon OuiOui

La fonction récursive est sa propre enveloppe !La fonction récursive est sa propre enveloppe !

Page 52: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 5252

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeuxFonction auto-enveloppéeFonction auto-enveloppée

NonNon OuiOui

La fonction récursive est sa propre enveloppe !La fonction récursive est sa propre enveloppe !

f ( x )f ( x ) = = if ( ... )if ( ... ) return( valeur )return( valeur ) elseelse return( return( f( ...f( ... f( ) f( ) ... )... ) ) )

Page 53: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 5353

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeuxFonction auto-enveloppéeFonction auto-enveloppée

NonNon OuiOui

La fonction récursive est sa propre enveloppe !La fonction récursive est sa propre enveloppe !

f ( x )f ( x ) = = if ( ... )if ( ... ) return( valeur )return( valeur ) elseelse return( return( f( ...f( ... f( ) f( ) ... )... ) ) )

La fonction enveloppeLa fonction enveloppede de « f »« f » est est « f » « f » !!

L’appel externe L’appel externe « f »« f »est terminal.est terminal.

Page 54: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 5454

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeuxFonction auto-enveloppéeFonction auto-enveloppée

NonNon OuiOui

Une fonction « h » enveloppe les deux appels récursifs !Une fonction « h » enveloppe les deux appels récursifs !

Page 55: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 5555

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeuxFonction auto-enveloppéeFonction auto-enveloppée

NonNon OuiOui

Une fonction « h » enveloppe les deux appels récursifs !Une fonction « h » enveloppe les deux appels récursifs !

f ( x )f ( x ) = = if ( ... )if ( ... ) return( valeur )return( valeur ) elseelse return( return( h( ...h( ... f( ) f( ) ...... f( ) f( ) ... )... ) ) )

Page 56: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 5656

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeuxFonction auto-enveloppéeFonction auto-enveloppée

NonNon OuiOuiEnveloppe associativeEnveloppe associative

OuiOui NonNon

Page 57: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 5757

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeuxFonction auto-enveloppéeFonction auto-enveloppée

NonNon OuiOuiEnveloppe associativeEnveloppe associative

OuiOui NonNonAvec élément neutreAvec élément neutre

OuiOui NonNon

Page 58: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 5858

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeuxFonction auto-enveloppéeFonction auto-enveloppée

NonNon OuiOuiEnveloppe associativeEnveloppe associative

OuiOui NonNonAvec élément neutreAvec élément neutre

OuiOui NonNon

Appréciations !Appréciations !

Page 59: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 5959

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeuxFonction auto-enveloppéeFonction auto-enveloppée

NonNon OuiOuiEnveloppe associativeEnveloppe associative

OuiOui NonNonAvec élément neutreAvec élément neutre

OuiOui NonNon

Appréciations !Appréciations !

TransformationTransformationintéressante !intéressante !

Page 60: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 6060

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeuxFonction auto-enveloppéeFonction auto-enveloppée

NonNon OuiOuiEnveloppe associativeEnveloppe associative

OuiOui NonNonAvec élément neutreAvec élément neutre

OuiOui NonNon

Appréciations !Appréciations !

TransformationTransformationintéressante !intéressante !

Celle-là aussi !Celle-là aussi !

Page 61: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 6161

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeuxFonction auto-enveloppéeFonction auto-enveloppée

NonNon OuiOuiEnveloppe associativeEnveloppe associative

OuiOui NonNonAvec élément neutreAvec élément neutre

OuiOui NonNon

Appréciations !Appréciations !

TransformationTransformationintéressante !intéressante !

Celle-là aussi !Celle-là aussi !

Sans espoir ! ! !Sans espoir ! ! !

Page 62: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 6262

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

D i S c U s S i O nD i S c U s S i O n

D e S d I v E r SD e S d I v E r S

C a S d E f I g U r E :C a S d E f I g U r E :

U n A p P e L r E c U r S i FU n A p P e L r E c U r S i F

Page 63: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 6363

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Un seul appel récursif qui est terminal.Un seul appel récursif qui est terminal.

• C’est le cas de base, il est fondamental.C’est le cas de base, il est fondamental.

Page 64: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 6464

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOuiAvec élément neutreAvec élément neutre

NonNon OuiOui

Page 65: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 6565

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Un seul appel récursif qui est terminal.Un seul appel récursif qui est terminal.

• C’est le cas de base, il est fondamental.C’est le cas de base, il est fondamental.

• Il se transforme en boucle while sans pile.Il se transforme en boucle while sans pile.

Page 66: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 6666

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Un seul appel récursif qui est terminal.Un seul appel récursif qui est terminal.

• C’est le cas de base, il est fondamental.C’est le cas de base, il est fondamental.

• Il se transforme en boucle while sans pile.Il se transforme en boucle while sans pile.

• Les appels non terminaux avec une Les appels non terminaux avec une enveloppe associative se ramènent à ce enveloppe associative se ramènent à ce cas.cas.

Page 67: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 6767

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOuiAvec élément neutreAvec élément neutre

NonNon OuiOui

Page 68: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 6868

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Un seul appel récursif qui est terminal.Un seul appel récursif qui est terminal.

• C’est le cas de base, il est fondamental.C’est le cas de base, il est fondamental.

• Il se transforme en boucle while sans pile.Il se transforme en boucle while sans pile.

• Les appels non terminaux avec une Les appels non terminaux avec une enveloppe associative se ramènent à ce cas.enveloppe associative se ramènent à ce cas.

• Tout ce qui ne se ramène pas à Tout ce qui ne se ramène pas à ce cas nécessitera une pile ! ! !ce cas nécessitera une pile ! ! !

Page 69: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 6969

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Exemple :Exemple :

– Soient des couples ( x , y ) avec x >= y .Soient des couples ( x , y ) avec x >= y .

– On définit le « pgcd » comme ci-dessous.On définit le « pgcd » comme ci-dessous.

– La notation est proche d’une notation mathématique.La notation est proche d’une notation mathématique.

res <- pgcd( ( a , b ) )res <- pgcd( ( a , b ) )

pgcd ( ( m , n ) ) =pgcd ( ( m , n ) ) = si ( n = 0 )si ( n = 0 ) mm sinonsinon pgcd( ( n , m % n ) )pgcd( ( n , m % n ) )

Page 70: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 7070

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Exemple :Exemple :

– Soient des couples ( x , y ) avec x >= y .Soient des couples ( x , y ) avec x >= y .

– On définit le « pgcd » comme ci-dessous.On définit le « pgcd » comme ci-dessous.

– La notation est proche d’une notation mathématique.La notation est proche d’une notation mathématique.

res <- pgcd( ( a , b ) )res <- pgcd( ( a , b ) )

pgcd ( ( m , n ) ) =pgcd ( ( m , n ) ) = si ( n = 0 )si ( n = 0 ) mm sinonsinon pgcd( ( n , m % n ) )pgcd( ( n , m % n ) )

L’appel initial.L’appel initial.

Page 71: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 7171

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Exemple :Exemple :

– Soient des couples ( x , y ) avec x >= y .Soient des couples ( x , y ) avec x >= y .

– On définit le « pgcd » comme ci-dessous.On définit le « pgcd » comme ci-dessous.

– La notation est proche d’une notation mathématique.La notation est proche d’une notation mathématique.

res <- pgcd( ( a , b ) )res <- pgcd( ( a , b ) )

pgcd ( ( m , n ) ) =pgcd ( ( m , n ) ) = si ( n = 0 )si ( n = 0 ) mm sinonsinon pgcd( ( n , m % n ) )pgcd( ( n , m % n ) )

L’appel initial.L’appel initial.

L’entête de définition.L’entête de définition.

Page 72: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 7272

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Exemple :Exemple :

– Soient des couples ( x , y ) avec x >= y .Soient des couples ( x , y ) avec x >= y .

– On définit le « pgcd » comme ci-dessous.On définit le « pgcd » comme ci-dessous.

– La notation est proche d’une notation mathématique.La notation est proche d’une notation mathématique.

res <- pgcd( ( a , b ) )res <- pgcd( ( a , b ) )

pgcd ( ( m , n ) ) =pgcd ( ( m , n ) ) = si ( n = 0 )si ( n = 0 ) mm sinonsinon pgcd( ( n , m % n ) )pgcd( ( n , m % n ) )

L’appel initial.L’appel initial.

L’entête de définition.L’entête de définition.

Le corps de la définition :Le corps de la définition :

- l’indentation importe.l’indentation importe.

- les « return » sont implicites.les « return » sont implicites.

Page 73: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 7373

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Exemple :Exemple :

– Soient des couples ( x , y ) avec x >= y .Soient des couples ( x , y ) avec x >= y .

– On définit le « pgcd » comme ci-dessous.On définit le « pgcd » comme ci-dessous.

– La notation est proche d’une notation mathématique.La notation est proche d’une notation mathématique.

res <- pgcd( ( a , b ) )res <- pgcd( ( a , b ) )

pgcd ( ( m , n ) ) =pgcd ( ( m , n ) ) = si ( n = 0 )si ( n = 0 ) mm sinonsinon pgcd( ( n , m % n ) )pgcd( ( n , m % n ) )

L’appel initial.L’appel initial.

L’entête de définition.L’entête de définition.

Le corps de la définition :Le corps de la définition :

- l’indentation importe.l’indentation importe.

- les « return » sont implicites.les « return » sont implicites.

Page 74: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 7474

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Ce programme est de la forme :Ce programme est de la forme :

res <- pgcd( ( a , b ) )res <- pgcd( ( a , b ) )

pgcd ( ( m , n ) ) =pgcd ( ( m , n ) ) = si ( n = 0 )si ( n = 0 ) mm sinonsinon pgcd( ( n , m % n ) )pgcd( ( n , m % n ) )

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon f( f( ( x ) )( x ) )

Page 75: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 7575

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Ce programme est de la forme :Ce programme est de la forme :

res <- res <- pgcdpgcd( ( a , b ) )( ( a , b ) )

pgcd ( ( m , n ) ) =pgcd ( ( m , n ) ) = si ( n = 0 )si ( n = 0 ) mm sinonsinon pgcd( ( n , m % n ) )pgcd( ( n , m % n ) )

res <- res <- ff( v )( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon f( f( ( x ) )( x ) )

Page 76: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 7676

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Ce programme est de la forme :Ce programme est de la forme :

res <- res <- pgcdpgcd( ( ( a , b )( a , b ) ) )

pgcd ( ( m , n ) ) =pgcd ( ( m , n ) ) = si ( n = 0 )si ( n = 0 ) mm sinonsinon pgcd( ( n , m % n ) )pgcd( ( n , m % n ) )

res <- res <- ff( ( v v ))

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon f( f( ( x ) )( x ) )

Page 77: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 7777

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Ce programme est de la forme :Ce programme est de la forme :

res <- res <- pgcdpgcd( ( ( a , b )( a , b ) ) )

pgcd ( pgcd ( ( m , n )( m , n ) ) = ) = si ( n = 0 )si ( n = 0 ) mm sinonsinon pgcd( ( n , m % n ) )pgcd( ( n , m % n ) )

res <- res <- ff( ( v v ))

f ( f ( x x ) =) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon f( f( ( x ) )( x ) )

Page 78: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 7878

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Ce programme est de la forme :Ce programme est de la forme :

res <- res <- pgcdpgcd( ( ( a , b )( a , b ) ) )

pgcd ( pgcd ( ( m , n )( m , n ) ) = ) = si ( si ( n = 0n = 0 ) ) mm sinonsinon pgcd( ( n , m % n ) )pgcd( ( n , m % n ) )

res <- res <- ff( ( v v ))

f ( f ( x x ) =) = si ( si ( ( x )( x ) ) ) a( x )a( x ) sinonsinon f( f( ( x ) )( x ) )

Page 79: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 7979

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Ce programme est de la forme :Ce programme est de la forme :

res <- res <- pgcdpgcd( ( ( a , b )( a , b ) ) )

pgcd ( pgcd ( ( m , n )( m , n ) ) = ) = si ( si ( n = 0n = 0 ) ) mm sinonsinon pgcd( ( n , m % n ) )pgcd( ( n , m % n ) )

res <- res <- ff( ( v v ))

f ( f ( x x ) =) = si ( si ( ( x )( x ) ) ) a( x )a( x ) sinonsinon f( f( ( x ) )( x ) )

Page 80: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 8080

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Ce programme est de la forme :Ce programme est de la forme :

res <- res <- pgcdpgcd( ( ( a , b )( a , b ) ) )

pgcd ( pgcd ( ( m , n )( m , n ) ) = ) = si ( si ( n = 0n = 0 ) ) mm sinonsinon pgcd( pgcd( ( n , m % n )( n , m % n ) ) )

res <- res <- ff( ( v v ))

f ( f ( x x ) =) = si ( si ( ( x )( x ) ) ) a( x )a( x ) sinonsinon f( f( ( x )( x ) ) )

Page 81: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 8181

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Ce programme est de la forme :Ce programme est de la forme :

• Les calculs réalisés sont les suivants :Les calculs réalisés sont les suivants :

res <- res <- pgcdpgcd( ( ( a , b )( a , b ) ) )

pgcd ( pgcd ( ( m , n )( m , n ) ) = ) = si ( si ( n = 0n = 0 ) ) mm sinonsinon pgcd( pgcd( ( n , m % n )( n , m % n ) ) )

res <- res <- ff( ( v v ))

f ( f ( x x ) =) = si ( si ( ( x )( x ) ) ) a( x )a( x ) sinonsinon f( f( ( x )( x ) ) )

Page 82: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 8282

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Ce programme est de la forme :Ce programme est de la forme :

• Les calculs réalisés sont les suivants :Les calculs réalisés sont les suivants :

– Si Si ( ( vv ) ) alors alors a( a( vv ) ) et sinon :et sinon :

res <- res <- pgcdpgcd( ( ( a , b )( a , b ) ) )

pgcd ( pgcd ( ( m , n )( m , n ) ) = ) = si ( si ( n = 0n = 0 ) ) mm sinonsinon pgcd( pgcd( ( n , m % n )( n , m % n ) ) )

res <- res <- ff( ( v v ))

f ( f ( x x ) =) = si ( si ( ( x )( x ) ) ) a( x )a( x ) sinonsinon f( f( ( x )( x ) ) )

Page 83: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 8383

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Ce programme est de la forme :Ce programme est de la forme :

• Les calculs réalisés sont les suivants :Les calculs réalisés sont les suivants :

– Si Si ( ( vv ) ) alors alors a( a( vv ) ) et sinon :et sinon :

– Si Si ( ( ( ( vv ) ) )) alors alors a(a( ( ( vv ) ) ) ) et sinon :et sinon :

res <- res <- pgcdpgcd( ( ( a , b )( a , b ) ) )

pgcd ( pgcd ( ( m , n )( m , n ) ) = ) = si ( si ( n = 0n = 0 ) ) mm sinonsinon pgcd( pgcd( ( n , m % n )( n , m % n ) ) )

res <- res <- ff( ( v v ))

f ( f ( x x ) =) = si ( si ( ( x )( x ) ) ) a( x )a( x ) sinonsinon f( f( ( x )( x ) ) )

Page 84: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 8484

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Ce programme est de la forme :Ce programme est de la forme :

• Les calculs réalisés sont les suivants :Les calculs réalisés sont les suivants :

– Si Si ( ( vv ) ) alors alors a( a( vv ) ) et sinon :et sinon :

– Si Si ( ( ( ( vv ) ) )) alors alors a(a( ( ( vv ) ) ) ) et sinon :et sinon :

– Si Si ( ( ( ( ( ( v v ) )) ) )) alors alors a(a( ( ( ( ( vv ) ) ) ) ) ), etc . . ., etc . . .

res <- res <- pgcdpgcd( ( ( a , b )( a , b ) ) )

pgcd ( pgcd ( ( m , n )( m , n ) ) = ) = si ( si ( n = 0n = 0 ) ) mm sinonsinon pgcd( pgcd( ( n , m % n )( n , m % n ) ) )

res <- res <- ff( ( v v ))

f ( f ( x x ) =) = si ( si ( ( x )( x ) ) ) a( x )a( x ) sinonsinon f( f( ( x )( x ) ) )

Page 85: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 8585

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Ce programme est de la forme :Ce programme est de la forme :

• Le résultat final sera :Le résultat final sera :

res <- res <- pgcdpgcd( ( ( a , b )( a , b ) ) )

pgcd ( pgcd ( ( m , n )( m , n ) ) = ) = si ( si ( n = 0n = 0 ) ) mm sinonsinon pgcd( pgcd( ( n , m % n )( n , m % n ) ) )

res <- res <- ff( ( v v ))

f ( f ( x x ) =) = si ( si ( ( x )( x ) ) ) a( x )a( x ) sinonsinon f( f( ( x )( x ) ) )

Page 86: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 8686

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Ce programme est de la forme :Ce programme est de la forme :

• Le résultat final sera :Le résultat final sera :

– a(a( ( ( vv ) ) ) )

– avec k = avec k = i . i i . i N et N et ( ( ( v ) )( v ) )

– où où i . . . . signifie « le plus petit i tel que ». i . . . . signifie « le plus petit i tel que ».

kk

iiII

res <- res <- pgcdpgcd( ( ( a , b )( a , b ) ) )

pgcd ( pgcd ( ( m , n )( m , n ) ) = ) = si ( si ( n = 0n = 0 ) ) mm sinonsinon pgcd( pgcd( ( n , m % n )( n , m % n ) ) )

res <- res <- ff( ( v v ))

f ( f ( x x ) =) = si ( si ( ( x )( x ) ) ) a( x )a( x ) sinonsinon f( f( ( x )( x ) ) )

Page 87: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 8787

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Le programme itératif correspondant :Le programme itératif correspondant :

( m , n ) <- ( a , b )( m , n ) <- ( a , b )

while ( while ( ( n = 0 ) ) ( n = 0 ) ) ( m , n ) <- ( n , m % n )( m , n ) <- ( n , m % n )

res <- mres <- m

Page 88: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 8888

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Le programme itératif correspondant :Le programme itératif correspondant :

( m , n ) <- ( a , b )( m , n ) <- ( a , b )

while ( while ( ( n = 0 ) ) ( n = 0 ) ) ( m , n ) <- ( n , m % n )( m , n ) <- ( n , m % n )

res <- mres <- m

x <- vx <- v

while ( while ( ( x ) )( x ) ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

Page 89: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 8989

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Le programme itératif correspondant :Le programme itératif correspondant :

( m , n )( m , n ) <- <- ( a , b )( a , b )

while ( while ( ( n = 0 )( n = 0 ) ) ) ( m , n ) <- ( m , n ) <- ( n , m % n )( n , m % n )

res <- res <- mm

xx <- <- vv

while ( while ( ( x )( x ) ) ) x <- x <- ( x )( x )

res <- res <- a( x )a( x )

Page 90: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 9090

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Le programme itératif correspondant :Le programme itératif correspondant :

• Le résultat sera d’ailleurs le même :Le résultat sera d’ailleurs le même :

– a(a( ( ( vv ) ) ) ) avec k = avec k = i . i i . i N et N et ( ( ( v ) )( v ) )

( m , n )( m , n ) <- <- ( a , b )( a , b )

while ( while ( ( n = 0 )( n = 0 ) ) ) ( m , n ) <- ( m , n ) <- ( n , m % n )( n , m % n )

res <- res <- mm

kk iiII

xx <- <- vv

while ( while ( ( x )( x ) ) ) x <- x <- ( x )( x )

res <- res <- a( x )a( x )

Page 91: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 9191

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Donc, nous avons l’équivalence fondamentale Donc, nous avons l’équivalence fondamentale suivante :suivante :

x <- vx <- v

while ( while ( ( x ) )( x ) ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon f( f( ( x ) )( x ) )

Page 92: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 9292

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Donc, nous avons l’équivalence fondamentale Donc, nous avons l’équivalence fondamentale suivante :suivante :

x <- vx <- v

while ( while ( ( x ) )( x ) ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon f( f( ( x ) )( x ) )

Page 93: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 9393

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Donc, nous avons l’équivalence fondamentale Donc, nous avons l’équivalence fondamentale suivante :suivante :

x <- vx <- v

while ( while ( ( x ) )( x ) ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon f( f( ( x ) )( x ) )

Page 94: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 9494

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Donc, nous avons l’équivalence fondamentale Donc, nous avons l’équivalence fondamentale suivante :suivante :

x <- vx <- v

while ( while ( ( x ) )( x ) ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon f( f( ( x ) )( x ) )

Page 95: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 9595

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Donc, nous avons l’équivalence fondamentale Donc, nous avons l’équivalence fondamentale suivante :suivante :

x <- vx <- v

while ( while ( ( x ) )( x ) ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon f( f( ( x ) )( x ) )

Page 96: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 9696

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Donc, nous avons l’équivalence fondamentale Donc, nous avons l’équivalence fondamentale suivante :suivante :

x <- vx <- v

while ( while ( ( x ) )( x ) ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon f( f( ( x ) )( x ) )

Page 97: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 9797

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• L’équivalence se généralise à deux ou plusieurs L’équivalence se généralise à deux ou plusieurs arguments :arguments :

x <- vx <- vy <- wy <- w

while ( while ( ( x , y ) )( x , y ) ) m <- m <- ( x , y )( x , y ) y <- y <- ( x , y )( x , y ) x <- mx <- m

res <- a( x , y )res <- a( x , y )

res <- f( v , w )res <- f( v , w )

f ( x , y ) =f ( x , y ) = si ( si ( ( x , y ) )( x , y ) ) a( x , y )a( x , y ) sinonsinon f( f( ( x , y ) ,( x , y ) , ( x , y ) )( x , y ) )

Page 98: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 9898

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Exemple : « pgcd » comme fonction binaire :Exemple : « pgcd » comme fonction binaire :

x <- vx <- vy <- wy <- w

while ( while ( ( y = 1 ) ) ( y = 1 ) ) m <- ym <- y y <- x % yy <- x % y x <- mx <- m

res <- xres <- x

res <- pgcd( v , w )res <- pgcd( v , w )

pgcd ( x , y ) =pgcd ( x , y ) = si ( y = 1 )si ( y = 1 ) xx sinonsinon pgcd( y , x % y )pgcd( y , x % y )

Page 99: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 9999

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Un autre exemple :Un autre exemple :

res <- fct( a )res <- fct( a )

fct ( x ) =fct ( x ) = si ( x = 1 )si ( x = 1 ) xx sinonsinon si ( pair( x ) )si ( pair( x ) ) fct( x / 2 )fct( x / 2 ) sinonsinon fct( 3 * x + 1 )fct( 3 * x + 1 )

Page 100: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 100100

Un appel récursif, terminalUn appel récursif, terminal----------------------------------------------------------------------------------------------------------------------------------

• Un autre exemple :Un autre exemple :

x <- ax <- a

while ( while ( ( x = 1 ) ) ( x = 1 ) ) si ( pair( x ) )si ( pair( x ) ) x <- x / 2x <- x / 2 sinonsinon x <- 3 * x + 1x <- 3 * x + 1

res <- xres <- x

res <- fct( a )res <- fct( a )

fct ( x ) =fct ( x ) = si ( x = 1 )si ( x = 1 ) xx sinonsinon si ( pair( x ) )si ( pair( x ) ) fct( x / 2 )fct( x / 2 ) sinonsinon fct( 3 * x + 1 )fct( 3 * x + 1 )

Page 101: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 101101

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Page 102: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 102102

PlanPlan----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOuiAvec élément neutreAvec élément neutre

NonNon OuiOui

Page 103: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 103103

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Un appel récursif ayant une enveloppe « h ».Un appel récursif ayant une enveloppe « h ».

• Nous avons la forme générale suivante :Nous avons la forme générale suivante :

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , ( x ) , f( f( ( x ) ) ( x ) ) ))

Page 104: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 104104

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Un appel récursif ayant une enveloppe « h ».Un appel récursif ayant une enveloppe « h ».

• Nous avons la forme générale suivante :Nous avons la forme générale suivante :

• Si « h » est associative, nous pouvons nous ramener au cas Si « h » est associative, nous pouvons nous ramener au cas récursif terminal précédent,récursif terminal précédent,

• et donc nous ramener à une itération sans pile.et donc nous ramener à une itération sans pile.

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , ( x ) , f( f( ( x ) ) ( x ) ) ))

Page 105: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 105105

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Posons simplement :Posons simplement :

F( acc , x ) = h( acc , f( x ) )F( acc , x ) = h( acc , f( x ) )

Page 106: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 106106

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Posons simplement :Posons simplement :

F( acc , x ) = h( acc , f( x ) )F( acc , x ) = h( acc , f( x ) )

• Pourquoi ? ? ?Pourquoi ? ? ? Parce que ça marchera ! ! !Parce que ça marchera ! ! !

Page 107: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 107107

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Posons simplement :Posons simplement :

F( acc , x ) = h( acc , f( x ) )F( acc , x ) = h( acc , f( x ) )

• Pourquoi ? ? ?Pourquoi ? ? ? Parce que ça marchera ! ! !Parce que ça marchera ! ! !

• Déjà, si « h » admet le neutre « e » :Déjà, si « h » admet le neutre « e » :

f( x ) = h( e , f( x ) ) = F( e , x )f( x ) = h( e , f( x ) ) = F( e , x )

Page 108: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 108108

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Posons simplement :Posons simplement :

F( acc , x ) = h( acc , f( x ) )F( acc , x ) = h( acc , f( x ) )

• Pourquoi ? ? ?Pourquoi ? ? ? Parce que ça marchera ! ! !Parce que ça marchera ! ! !

• Déjà, si « h » admet le neutre « e » :Déjà, si « h » admet le neutre « e » :

f( x ) = h( e , f( x ) ) = F( e , x )f( x ) = h( e , f( x ) ) = F( e , x )

– Nous pouvons donc remplacerNous pouvons donc remplacer

• l’appel l’appel f( v ) f( v ) parpar

• l’appell’appel F( e , v ) F( e , v )

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = ......

Page 109: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 109109

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Il reste à exprimer F à l’aide d’elle-même et de Il reste à exprimer F à l’aide d’elle-même et de manière récursive terminale. h est associative. Nous manière récursive terminale. h est associative. Nous avons :avons :

F( acc , x ) = h( acc , f( x ) )F( acc , x ) = h( acc , f( x ) )

Page 110: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 110110

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Il reste à exprimer F à l’aide d’elle-même et de Il reste à exprimer F à l’aide d’elle-même et de manière récursive terminale. h est associative. Nous manière récursive terminale. h est associative. Nous avons :avons :

F( acc , x ) = h( acc , F( acc , x ) = h( acc , f( x )f( x ) ) )

« f » est remplacée« f » est remplacéepar sa définition !par sa définition !

Page 111: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 111111

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Il reste à exprimer F à l’aide d’elle-même et de Il reste à exprimer F à l’aide d’elle-même et de manière récursive terminale. h est associative. Nous manière récursive terminale. h est associative. Nous avons :avons :

F( acc , x ) = h( acc , F( acc , x ) = h( acc , f( x )f( x ) ) ) = h( acc , = h( acc , si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) ) ) )

« f » est remplacée« f » est remplacéepar sa définition !par sa définition !

Page 112: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 112112

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Il reste à exprimer F à l’aide d’elle-même et de manière Il reste à exprimer F à l’aide d’elle-même et de manière récursive terminale. h est associative. Nous avons :récursive terminale. h est associative. Nous avons :

F( acc , x ) = h( acc , F( acc , x ) = h( acc , f( x )f( x ) ) ) = h( acc , = h( acc , si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) ) ) )

• Remarque ! On a « toujours » :Remarque ! On a « toujours » :

h( h( xx , si C alors , si C alors AA sinon sinon B B ) ) == si C alors h( si C alors h( x x , , A A ) sinon h() sinon h( x x , , B B ))

« f » est remplacée« f » est remplacéepar sa définition !par sa définition !

Page 113: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 113113

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Il reste à exprimer F à l’aide d’elle-même et de Il reste à exprimer F à l’aide d’elle-même et de manière récursive terminale. h est associative. Nous manière récursive terminale. h est associative. Nous avons :avons :

F( acc , x ) = h( acc , F( acc , x ) = h( acc , f( x )f( x ) ) ) = h( acc , = h( acc , si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) ) ) ) = = si ( si ( ( x ) )( x ) ) h( acc , h( acc , a( x )a( x ) ) ) sinonsinon h( acc , h( acc , h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) ) ) )

« f » est remplacée« f » est remplacéepar sa définition !par sa définition !

Page 114: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 114114

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Il reste à exprimer F à l’aide d’elle-même et de Il reste à exprimer F à l’aide d’elle-même et de manière récursive terminale. h est associative. Nous manière récursive terminale. h est associative. Nous avons :avons :

F( acc , x ) = h( acc , F( acc , x ) = h( acc , f( x )f( x ) ) ) = h( acc , = h( acc , si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) ) ) ) = = si ( si ( ( x ) )( x ) ) h( acc , h( acc , a( x )a( x ) ) ) sinonsinon h( acc , h( acc , h( h( ( x )( x ) , f( , f( ( x ) ) )( x ) ) ) ) )

« f » est remplacée« f » est remplacéepar sa définition !par sa définition !

Associativité !Associativité !

Page 115: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 115115

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Il reste à exprimer F à l’aide d’elle-même et de Il reste à exprimer F à l’aide d’elle-même et de manière récursive terminale. h est associative. Nous manière récursive terminale. h est associative. Nous avons :avons :

F( acc , x ) = h( acc , F( acc , x ) = h( acc , f( x )f( x ) ) ) = h( acc , = h( acc , si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) ) ) ) = = si ( si ( ( x ) )( x ) ) h( acc , h( acc , a( x )a( x ) ) ) sinonsinon h( acc , h( acc , h( h( ( x )( x ) , f( , f( ( x ) ) )( x ) ) ) ) ) h( h( h( h( acc , acc , ( x )( x ) ) , f( ) , f( ( x ) )( x ) ) ) )

« f » est remplacée« f » est remplacéepar sa définition !par sa définition !

Associativité !Associativité !

Page 116: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 116116

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Il reste à exprimer F à l’aide d’elle-même et de Il reste à exprimer F à l’aide d’elle-même et de manière récursive terminale. h est associative. Nous manière récursive terminale. h est associative. Nous avons :avons :

F( acc , x ) = h( acc , F( acc , x ) = h( acc , f( x )f( x ) ) ) = h( acc , = h( acc , si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) ) ) ) = = si ( si ( ( x ) )( x ) ) h( acc , h( acc , a( x )a( x ) ) ) sinonsinon h( acc , h( acc , h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) ) ) ) h(h( h( acc , h( acc , ( x ) )( x ) ) , , f(f( ( x )( x ) ) )) )

« f » est remplacée« f » est remplacéepar sa définition !par sa définition !

Associativité !Associativité !

Définition de F !Définition de F !F( a , b ) =F( a , b ) =

h( h( aa , f( , f( bb ) ) ) )

Page 117: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 117117

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Il reste à exprimer F à l’aide d’elle-même et de manière Il reste à exprimer F à l’aide d’elle-même et de manière récursive terminale. h est associative. Nous avons :récursive terminale. h est associative. Nous avons :

F( acc , x ) = h( acc , F( acc , x ) = h( acc , f( x )f( x ) ) ) = h( acc , = h( acc , si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) ) ) ) = = si ( si ( ( x ) )( x ) ) h( acc , h( acc , a( x )a( x ) ) ) sinonsinon h( acc , h( acc , h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) ) ) ) h(h( h( acc , h( acc , ( x ) )( x ) ) , , f(f( ( x )( x ) ) )) ) F(F( h( acc , h( acc , ( x ) )( x ) ) , , ( x )( x ) ))

« f » est remplacée« f » est remplacéepar sa définition !par sa définition !

Associativité !Associativité !

Définition de F !Définition de F !F( a , b ) =F( a , b ) =

h( h( aa , f( , f( bb ) ) ) )

Page 118: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 118118

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Pour h est associative, nous obtenons donc la Pour h est associative, nous obtenons donc la définition récursive terminale suivante :définition récursive terminale suivante :

F( acc , x ) = F( acc , x ) = si ( si ( ( x ) )( x ) ) h( acc , h( acc , a( x )a( x ) ) ) sinonsinon F(F( h( acc , h( acc , ( x ) )( x ) ) , , ( x )( x ) ))

Page 119: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 119119

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Pour h est associative, nous obtenons donc la Pour h est associative, nous obtenons donc la définition récursive terminale suivante :définition récursive terminale suivante :

F( acc , x ) = F( acc , x ) = si ( si ( ( x ) )( x ) ) h( acc , h( acc , a( x )a( x ) ) ) sinonsinon F(F( h( acc , h( acc , ( x ) )( x ) ) , , ( x )( x ) ))

Page 120: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 120120

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Pour h est associative, nous obtenons donc la Pour h est associative, nous obtenons donc la définition récursive terminale suivante :définition récursive terminale suivante :

F( acc , x ) = F( acc , x ) = si si ( ( ( x ) )( x ) ) h( acc , a( x ) )h( acc , a( x ) ) sinonsinon F(F( h( acc , h( acc , ( x ) )( x ) ) , , ( x )( x ) ))

• Le programme itératif correspondant :Le programme itératif correspondant :

while while ( ( ( x ) )( x ) ) acc <- h( acc , acc <- h( acc , ( x ) )( x ) ) x <- x <- ( x )( x )

res <- h( acc , a( x ) )res <- h( acc , a( x ) )

Page 121: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 121121

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Pour h est associative, nous obtenons donc la Pour h est associative, nous obtenons donc la définition récursive terminale suivante :définition récursive terminale suivante :

F( acc , x ) = F( acc , x ) = si si ( ( ( x ) )( x ) ) h( acc , a( x ) )h( acc , a( x ) ) sinonsinon F(F( h( acc , h( acc , ( x ) )( x ) ) , , ( x )( x ) ))

• Le programme itératif correspondant :Le programme itératif correspondant :

while while ( ( ( x ) )( x ) ) acc <- h( acc , acc <- h( acc , ( x ) )( x ) ) x <- x <- ( x )( x )

res <- h( acc , a( x ) )res <- h( acc , a( x ) )

D’où le nomD’où le nomd’accumulateur !d’accumulateur !

Page 122: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 122122

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• L’initialisation est simple si « h » admet un neutre « e » L’initialisation est simple si « h » admet un neutre « e » : :

f( v ) = F( e , v )f( v ) = F( e , v )

x <- vx <- vacc <- eacc <- e

while ( while ( ( x ) )( x ) ) acc <- h( acc , acc <- h( acc , ( x ) )( x ) ) x <- x <- ( x )( x )

res <- h( acc , a( x ) )res <- h( acc , a( x ) )

Page 123: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 123123

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• L’initialisation est simple si « h » admet un neutre « e » L’initialisation est simple si « h » admet un neutre « e » : :

f( v ) = F( e , v )f( v ) = F( e , v )

x <- vx <- vacc <- eacc <- e

while ( while ( ( x ) )( x ) ) acc <- h( acc , acc <- h( acc , ( x ) )( x ) ) x <- x <- ( x )( x )

res <- h( acc , a( x ) )res <- h( acc , a( x ) )

Page 124: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 124124

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Si « h » est associative avec neutre « e », nous avons : Si « h » est associative avec neutre « e », nous avons :

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) )

x <- vx <- vacc <- eacc <- e

while ( while ( ( x ) )( x ) ) acc <- h( acc , acc <- h( acc , ( x ) )( x ) ) x <- x <- ( x )( x )

res <- h( acc , a( x ) )res <- h( acc , a( x ) )

Page 125: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 125125

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• L’équivalence se généralise à deux ou plusieurs L’équivalence se généralise à deux ou plusieurs arguments : arguments :

res <- f( v , w )res <- f( v , w )

f ( x , y ) =f ( x , y ) = si ( si ( ( x , y ) )( x , y ) ) a( x , y )a( x , y ) sinonsinon h( h( ( x , y ) ,( x , y ) , f( f( ( x , y ) ,( x , y ) , ( x , y ) ) )( x , y ) ) )

x <- vx <- vy <- wy <- wacc <- eacc <- e

while ( while ( ( x , y ) )( x , y ) ) acc <- h( acc , acc <- h( acc , ( x , y ) )( x , y ) ) m <- m <- ( x , y )( x , y ) y <- y <- ( x , y )( x , y ) x <- mx <- m

res <- h( acc , a( x , y ) )res <- h( acc , a( x , y ) )

Page 126: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 126126

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• C’est un peu plus embêtant si « h » est sans neutre. C’est un peu plus embêtant si « h » est sans neutre. Nous devons alors traiter le premier appel « f( v ) » à Nous devons alors traiter le premier appel « f( v ) » à part, en observant que :part, en observant que :

f( x )f( x ) = si ( = si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) )

Page 127: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 127127

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• C’est un peu plus embêtant si « h » est sans neutre. C’est un peu plus embêtant si « h » est sans neutre. Nous devons alors traiter le premier appel « f( v ) » à Nous devons alors traiter le premier appel « f( v ) » à part, en observant que :part, en observant que :

f( x )f( x ) = si ( = si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) ) F( F( ( x )( x ) , , ( x )( x ) ) )

Page 128: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 128128

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• C’est un peu plus embêtant si « h » est sans neutre. C’est un peu plus embêtant si « h » est sans neutre. Nous devons alors traiter le premier appel « f( v ) » à Nous devons alors traiter le premier appel « f( v ) » à part, en observant que :part, en observant que :

f( x )f( x ) = si ( = si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) ) F( F( ( x )( x ) , , ( x )( x ) ) )

x <- vx <- v

si ( si ( ( x ) )( x ) ) res <- a( x )res <- a( x )sinonsinon acc <- acc <- ( x )( x ) x <- x <- ( x )( x ) while ( while ( ( x ) )( x ) ) acc <- h( acc , acc <- h( acc , ( x ) )( x ) ) x <- x <- ( x )( x )

res <- h( acc , a( x ) )res <- h( acc , a( x ) )

Page 129: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 129129

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• C’est un peu plus embêtant si « h » est sans neutre. C’est un peu plus embêtant si « h » est sans neutre. Nous devons alors traiter le premier appel « f( v ) » à Nous devons alors traiter le premier appel « f( v ) » à part, en observant que :part, en observant que :

f( x )f( x ) = si ( = si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) ) F( F( ( x )( x ) , , ( x )( x ) ) )

x <- vx <- v

si ( si ( ( x ) )( x ) ) res <- a( x )res <- a( x )sinonsinon acc <- acc <- ( x )( x ) x <- x <- ( x )( x ) while ( while ( ( x ) )( x ) ) acc <- h( acc , acc <- h( acc , ( x ) )( x ) ) x <- x <- ( x )( x )

res <- h( acc , a( x ) )res <- h( acc , a( x ) )

Le premier élément est traité à part !Le premier élément est traité à part !Et nous passons au second élément !Et nous passons au second élément !

Page 130: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 130130

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• C’est un peu plus embêtant si « h » est sans neutre. C’est un peu plus embêtant si « h » est sans neutre. Nous devons alors traiter le premier appel « f( v ) » à Nous devons alors traiter le premier appel « f( v ) » à part, en observant que :part, en observant que :

f( x )f( x ) = si ( = si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) ) F( F( ( x )( x ) , , ( x )( x ) ) )

x <- vx <- v

si ( si ( ( x ) )( x ) ) res <- a( x )res <- a( x )sinonsinon acc <- acc <- ( x )( x ) x <- x <- ( x )( x ) while ( while ( ( x ) )( x ) ) acc <- h( acc , acc <- h( acc , ( x ) )( x ) ) x <- x <- ( x )( x )

res <- h( acc , a( x ) )res <- h( acc , a( x ) )

Le premier élément est traité à part !Le premier élément est traité à part !Et nous passons au second élément !Et nous passons au second élément !

Page 131: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 131131

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Si « h » est associative sans neutre, nous avons : Si « h » est associative sans neutre, nous avons :

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) )

x <- vx <- v

si ( si ( ( x ) )( x ) ) res <- a( x )res <- a( x )sinonsinon acc <- acc <- ( x )( x ) x <- x <- ( x )( x ) while ( while ( ( x ) )( x ) ) acc <- h( acc , acc <- h( acc , ( x ) )( x ) ) x <- x <- ( x )( x )

res <- h( acc , a( x ) )res <- h( acc , a( x ) )

Page 132: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 132132

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• L’équivalence se généralise à deux ou plusieurs L’équivalence se généralise à deux ou plusieurs arguments : arguments :

res <- f( v , w )res <- f( v , w )

f ( x , y ) =f ( x , y ) = si ( si ( ( x , y ) )( x , y ) ) a( x , y )a( x , y ) sinonsinon h( h( ( x , y ) ,( x , y ) , f( f( ( x , y ) ,( x , y ) , ( x , y ) ) )( x , y ) ) )

x <- vx <- vy <- wy <- wsi ( si ( ( x , y ) )( x , y ) ) res <- a( x , y )res <- a( x , y )sinonsinon acc <- acc <- ( x , y)( x , y) m <- m <- ( x , y )( x , y ) y <- y <- ( x , y )( x , y ) x <- mx <- m while ( while ( ( x , y ) )( x , y ) ) acc <- h( acc , acc <- h( acc , ( x , y) )( x , y) ) m <- m <- ( x , y )( x , y ) y <- y <- ( x , y )( x , y ) x <- mx <- m res <- h( acc , a( x ) )res <- h( acc , a( x ) )

Page 133: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 133133

Sous forme d’arbre …Sous forme d’arbre …----------------------------------------------------------------------------------------------------------------------------------

Page 134: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 134134

Sous forme d’arbre …Sous forme d’arbre …----------------------------------------------------------------------------------------------------------------------------------

a( v )a( v ) = ou bien= ou bien hh

( v )( v ) f( f( ( v ) )( v ) )

{{f( v )f( v )

Page 135: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 135135

Sous forme d’arbre …Sous forme d’arbre …----------------------------------------------------------------------------------------------------------------------------------

a( v )a( v ) = ou bien= ou bien hh

( v )( v ) f( f( ( v ) )( v ) )

{{f( v )f( v )

Continuons à développerContinuons à développerce deuxième terme !ce deuxième terme !

Page 136: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 136136

Sous forme d’arbre …Sous forme d’arbre …----------------------------------------------------------------------------------------------------------------------------------

= ou bien= ou bien hh

( v )( v )

{{hh

( v )( v ) f( f( ( v ) )( v ) )

hh

( v )( v ) a( a( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) f( f( ( ( ( v ) ) )( v ) ) )

Page 137: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 137137

Sous forme d’arbre …Sous forme d’arbre …----------------------------------------------------------------------------------------------------------------------------------

= ou bien= ou bien hh

( v )( v )

{{hh

( v )( v ) f( f( ( v ) )( v ) )

hh

( v )( v ) a( a( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) f( f( ( ( ( v ) ) )( v ) ) )

Page 138: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 138138

Sous forme d’arbre …Sous forme d’arbre …----------------------------------------------------------------------------------------------------------------------------------

= ou bien= ou bien hh

( v )( v )

{{hh

( v )( v ) f( f( ( v ) )( v ) )

hh

( v )( v ) a( a( ( v ) )( v ) )

hh

( ( ( v ) )( v ) )

f( f( ( ( ( v ) ) )( v ) ) )

Page 139: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 139139

Sous forme d’arbre …Sous forme d’arbre …----------------------------------------------------------------------------------------------------------------------------------

= ou bien= ou bien hh

( v )( v )

{{hh

( v )( v ) f( f( ( v ) )( v ) )

hh

( v )( v ) a( a( ( v ) )( v ) )

hh

( ( ( v ) )( v ) )

f( f( ( ( ( v ) ) )( v ) ) )Une valeur !Une valeur !

Page 140: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 140140

Sous forme d’arbre …Sous forme d’arbre …----------------------------------------------------------------------------------------------------------------------------------

= ou bien= ou bien hh

( v )( v )

{{hh

( v )( v ) f( f( ( v ) )( v ) )

hh

( v )( v ) a( a( ( v ) )( v ) )

hh

( ( ( v ) )( v ) )

f( f( ( ( ( v ) ) )( v ) ) )Une valeur !Une valeur !

Une autre valeur !Une autre valeur !

Page 141: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 141141

Sous forme d’arbre …Sous forme d’arbre …----------------------------------------------------------------------------------------------------------------------------------

= ou bien= ou bien hh

( v )( v )

{{hh

( v )( v ) f( f( ( v ) )( v ) )

hh

( v )( v ) a( a( ( v ) )( v ) )

hh

( ( ( v ) )( v ) )

f( f( ( ( ( v ) ) )( v ) ) )Une valeur !Une valeur !

Une autre valeur !Une autre valeur !

hh

ee f( v )f( v )

Une valeur initiale !Une valeur initiale !

Page 142: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 142142

Sous forme d’arbre …Sous forme d’arbre …----------------------------------------------------------------------------------------------------------------------------------

= ou bien= ou bien hh

( v )( v )

{{hh

( v )( v ) f( f( ( v ) )( v ) )

hh

( v )( v ) a( a( ( v ) )( v ) )

hh

( ( ( v ) )( v ) )

f( f( ( ( ( v ) ) )( v ) ) )Une valeur !Une valeur !

Une autre valeur !Une autre valeur !

hh

ee f( v )f( v )

Une valeur initiale !Une valeur initiale !

Page 143: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 143143

Le cas généralLe cas général----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1

Page 144: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 144144

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1hh

( v ) )( v ) )

f( f( ( v ) )( v ) )kk

k-1k-1

hh

( v )( v ) ……

Le cas généralLe cas général----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

Page 145: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 145145

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1

Page 146: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 146146

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1

Soit k = Soit k = i . i i . i N et N et ( ( ( v ) )( v ) )

iiII

Page 147: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 147147

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) ) ( v ) ) = a( = a( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1

Soit k = Soit k = i . i i . i N et N et ( ( ( v ) )( v ) )

iiII

kk

res <res <-- a( a( ( v ) )( v ) )kk

Page 148: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 148148

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) ) ( v ) ) = a( = a( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1

Soit k = Soit k = i . i i . i N et N et ( ( ( v ) )( v ) )

iiII

kk

res <res <-- a( a( ( v ) )( v ) )kk

res <res <-- h( h( ( v ) )( v ) ) , , resres ) )k-1k-1

Page 149: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 149149

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) ) ( v ) ) = a( = a( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1

Soit k = Soit k = i . i i . i N et N et ( ( ( v ) )( v ) )

iiII

kk

res <res <-- a( a( ( v ) )( v ) )kk

res <res <-- h( h( ( v ) )( v ) ) , , resres ) )k-1k-1

Page 150: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 150150

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) ) ( v ) ) = a( = a( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1

Soit k = Soit k = i . i i . i N et N et ( ( ( v ) )( v ) )

iiII

kk

res <res <-- a( a( ( v ) )( v ) )kk

res <res <-- h( h( ( v ) )( v ) ) , , resres ) )k-1k-1

Page 151: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 151151

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1Ou sont-elles ? ? ?Ou sont-elles ? ? ?

Page 152: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 152152

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1Ou sont-elles ? ? ?Ou sont-elles ? ? ?

Sur la pile, voyons !Sur la pile, voyons !

Page 153: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 153153

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1Ou sont-elles ? ? ?Ou sont-elles ? ? ?

Sur la pile, voyons !Sur la pile, voyons !

La pileLa pile

Page 154: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 154154

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1Ou sont-elles ? ? ?Ou sont-elles ? ? ?

Sur la pile, voyons !Sur la pile, voyons !

La pileLa pile

La dynamique ! ! !La dynamique ! ! !

Page 155: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 155155

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1Ou sont-elles ? ? ?Ou sont-elles ? ? ?

Sur la pile, voyons !Sur la pile, voyons !

La pileLa pile

( v )( v )

La dynamique ! ! !La dynamique ! ! !

Page 156: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 156156

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1Ou sont-elles ? ? ?Ou sont-elles ? ? ?

Sur la pile, voyons !Sur la pile, voyons !

La pileLa pile

( ( ( v ) )( v ) )

( v )( v )

La dynamique ! ! !La dynamique ! ! !

Page 157: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 157157

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1Ou sont-elles ? ? ?Ou sont-elles ? ? ?

Sur la pile, voyons !Sur la pile, voyons !

La pileLa pile

. . .. . .

( ( ( v ) )( v ) )

( v )( v )

La dynamique ! ! !La dynamique ! ! !

( ( ( v ) )( v ) )

Page 158: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 158158

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1Ou sont-elles ? ? ?Ou sont-elles ? ? ?

Sur la pile, voyons !Sur la pile, voyons !

La pileLa pile

( v ) )( v ) )k-1k-1

. . .. . .

( ( ( v ) )( v ) )

( v )( v )

La dynamique ! ! !La dynamique ! ! !

Page 159: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 159159

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1Ou sont-elles ? ? ?Ou sont-elles ? ? ?

Sur la pile, voyons !Sur la pile, voyons !

La pileLa pile

. . .. . .

( ( ( v ) )( v ) )

( v )( v )

La dynamique ! ! !La dynamique ! ! ! ( v ) )( v ) )k-1k-1

res <res <-- a( a( ( v ) )( v ) )kk

Page 160: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 160160

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1Ou sont-elles ? ? ?Ou sont-elles ? ? ?

Sur la pile, voyons !Sur la pile, voyons !

La pileLa pile

. . .. . .

( ( ( v ) )( v ) )

( v )( v )

La dynamique ! ! !La dynamique ! ! !

res <res <-- a( a( ( v ) )( v ) )kk

res <res <-- h( h( ( v ) ) ( v ) ) resres ) )k-1k-1

Page 161: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 161161

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

f( v ) = hf( v ) = h

( v )( v )

hh

( v ) )( v ) )f( f( ( v ) )( v ) )

hh

( ( ( v ) )( v ) ) . . .

. . .

kkk-1k-1Ou sont-elles ? ? ?Ou sont-elles ? ? ?

Sur la pile, voyons !Sur la pile, voyons !

La pileLa pile

La dynamique ! ! !La dynamique ! ! !

res <res <-- a( a( ( v ) )( v ) )kk

res <res <-- h( h( ( v ) ) ( v ) ) resres ) )k-1k-1

res <res <-- h( h( ( v )( v ) res res ))

Page 162: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 162162

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

p <- p <- I()I()x <- vx <- v

while ( while ( ( x ) )( x ) ) p <- p <- E( E( ( x ) , p )( x ) , p ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

while ( while ( V( p )V( p ) ) ) res <- h( res <- h( S( p )S( p ) , res ) , res ) p <- p <- D( p )D( p )

Page 163: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 163163

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

Légende des fonctions :Légende des fonctions :

- I( ) initialise une pile vide.I( ) initialise une pile vide.

- E( e , p ) empile e sur p.E( e , p ) empile e sur p.

- S( p ) rend une copie du S( p ) rend une copie du sommet de p.sommet de p.

- D( p ) supprime le sommet de D( p ) supprime le sommet de p.p.

- V( p ) dit si p est vide ou non.V( p ) dit si p est vide ou non.

p <- p <- I()I()x <- vx <- v

while ( while ( ( x ) )( x ) ) p <- p <- E( E( ( x ) , p )( x ) , p ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

while ( while ( V( p )V( p ) ) ) res <- h( res <- h( S( p )S( p ) , res ) , res ) p <- p <- D( p )D( p )

Page 164: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 164164

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

Légende des fonctions :Légende des fonctions :

- I( ) initialise une pile vide.I( ) initialise une pile vide.

- E( e , p ) empile e sur p.E( e , p ) empile e sur p.

- S( p ) rend une copie du S( p ) rend une copie du sommet de p.sommet de p.

- D( p ) supprime le sommet de D( p ) supprime le sommet de p.p.

- V( p ) dit si p est vide ou non.V( p ) dit si p est vide ou non.

p <- p <- I()I()x <- vx <- v

while ( while ( ( x ) )( x ) ) p <- p <- E( E( ( x ) , p )( x ) , p ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

while ( while ( V( p )V( p ) ) ) res <- h( res <- h( S( p )S( p ) , res ) , res ) p <- p <- D( p )D( p )

V( I() ) = VRAIV( I() ) = VRAIV( E( e , p ) ) = FAUXV( E( e , p ) ) = FAUXS( E( e , p ) ) = eS( E( e , p ) ) = eD( E( e , p ) ) = pD( E( e , p ) ) = p

Page 165: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 165165

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

p <- I()p <- I()x <- vx <- v

while ( while ( ( x ) )( x ) ) p <- E( p <- E( ( x ) , p )( x ) , p ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

while ( while ( V( p ) ) V( p ) ) res <- h( S( p ) , res )res <- h( S( p ) , res ) p <- D( p )p <- D( p )

L’initialisation !L’initialisation !

Page 166: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 166166

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

p <- I()p <- I()x <- vx <- v

while ( while ( ( x ) )( x ) ) p <- E( p <- E( ( x ) , p )( x ) , p ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

while ( while ( V( p ) ) V( p ) ) res <- h( S( p ) , res )res <- h( S( p ) , res ) p <- D( p )p <- D( p )

L’initialisation !L’initialisation !

Nous descendonsNous descendonsen empilant lesen empilant les

différents éléments.différents éléments.

Page 167: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 167167

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

p <- I()p <- I()x <- vx <- v

while ( while ( ( x ) )( x ) ) p <- E( p <- E( ( x ) , p )( x ) , p ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

while ( while ( V( p ) ) V( p ) ) res <- h( S( p ) , res )res <- h( S( p ) , res ) p <- D( p )p <- D( p )

L’initialisation !L’initialisation !

Nous descendonsNous descendonsen empilant lesen empilant les

différents éléments.différents éléments.

La valeur initiale du résultat !La valeur initiale du résultat !

Page 168: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 168168

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

p <- I()p <- I()x <- vx <- v

while ( while ( ( x ) )( x ) ) p <- E( p <- E( ( x ) , p )( x ) , p ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

while ( while ( V( p ) ) V( p ) ) res <- h( S( p ) , res )res <- h( S( p ) , res ) p <- D( p )p <- D( p )

L’initialisation !L’initialisation !

Nous descendonsNous descendonsen empilant lesen empilant les

différents éléments.différents éléments.

La valeur initiale du résultat !La valeur initiale du résultat !

Nous remontons enNous remontons encombinant lescombinant les

éléments empilés !éléments empilés !

Page 169: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 169169

Le cas général --- h non associativeLe cas général --- h non associative----------------------------------------------------------------------------------------------------------------------------------

p <- I()p <- I()x <- vx <- v

while ( while ( ( x ) )( x ) ) p <- E( p <- E( ( x ) , p )( x ) , p ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

while ( while ( V( p ) ) V( p ) ) res <- h( S( p ) , res )res <- h( S( p ) , res ) p <- D( p )p <- D( p )

L’initialisation !L’initialisation !

Nous descendonsNous descendonsen empilant lesen empilant les

différents éléments.différents éléments.

La valeur initiale du résultat !La valeur initiale du résultat !

Nous remontons enNous remontons encombinant lescombinant les

éléments empilés !éléments empilés !

Page 170: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 170170

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• Si « h » n’est pas associative, nous avons : Si « h » n’est pas associative, nous avons :

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) )

p <- I()p <- I()x <- vx <- v

while ( while ( ( x ) )( x ) ) p <- E( p <- E( ( x ) , p )( x ) , p ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

while ( while ( V( p ) ) V( p ) ) res <- h( S( p ) , res )res <- h( S( p ) , res ) p <- D( p )p <- D( p )

Page 171: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 171171

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• L’équivalence se généralise à 2 ou plus d’arguments L’équivalence se généralise à 2 ou plus d’arguments pour f : pour f :

res <- f( v , w )res <- f( v , w )

f ( x , y ) =f ( x , y ) = si ( si ( ( x , y ) )( x , y ) ) a( x , y )a( x , y ) sinonsinon h( h( ( x , y ) ,( x , y ) , f( f( ( x , y ) ,( x , y ) , ( x , y ) ) )( x , y ) ) )

p <- I()p <- I()x <- vx <- vy <- wy <- w

while ( while ( ( x , y ) )( x , y ) ) p <- E( p <- E( ( x , y ) , p )( x , y ) , p ) m <- m <- ( x , y )( x , y ) y <- y <- ( x , y )( x , y ) x <- mx <- m

res <- a( x , y )res <- a( x , y )

while ( while ( V( p ) ) V( p ) ) res <- h( S( p ) , res )res <- h( S( p ) , res ) p <- D( p )p <- D( p )

Page 172: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 172172

Un appel récursif, non-terminalUn appel récursif, non-terminal----------------------------------------------------------------------------------------------------------------------------------

• L’équivalence se généralise à 3 ou plus d’arguments L’équivalence se généralise à 3 ou plus d’arguments pour h : pour h :

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) ,( x ) , ( x ) ,( x ) , f( f( ( x ) ) )( x ) ) )

p <- I()p <- I()x <- vx <- v

while ( while ( ( x ) )( x ) ) p <- E( p <- E( ( x ) , p )( x ) , p ) p <- E( p <- E( ( x ) , p )( x ) , p ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

while ( while ( V( p ) ) V( p ) ) m <- S( p )m <- S( p ) p <- D( p )p <- D( p ) res <- h( S( p ) , m , res )res <- h( S( p ) , m , res ) p <- D( p )p <- D( p )

Page 173: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 173173

Un appel récursif --- résuméUn appel récursif --- résumé----------------------------------------------------------------------------------------------------------------------------------

R E S U M ER E S U M E

P O U RP O U R

U NU N

A P P E L R E C U R S A P P E L R E C U R S I FI F

Page 174: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 174174

Un appel récursif --- résuméUn appel récursif --- résumé----------------------------------------------------------------------------------------------------------------------------------

Fonction enveloppeFonction enveloppe

NonNon OuiOui

Nombre d’appels récursifsNombre d’appels récursifs

UnUn DeuxDeux

Enveloppe associativeEnveloppe associative

NonNon OuiOuiAvec élément neutreAvec élément neutre

NonNon OuiOui

Cas 1)Cas 1)

Cas 2)Cas 2)Cas 3)Cas 3)

Cas 4)Cas 4)

Nous retenons lesNous retenons lesquatre cas suivants !quatre cas suivants !

Page 175: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 175175

Un appel récursif --- résuméUn appel récursif --- résumé----------------------------------------------------------------------------------------------------------------------------------

• 1) Appel récursif terminal !1) Appel récursif terminal !

x <- vx <- v

while ( while ( ( x ) )( x ) ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon f( f( ( x ) )( x ) )

Code itératif raisonnable !Code itératif raisonnable !

Page 176: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 176176

Un appel récursif --- résuméUn appel récursif --- résumé----------------------------------------------------------------------------------------------------------------------------------

• 2) Appel récursif avec enveloppe associative et neutre 2) Appel récursif avec enveloppe associative et neutre « e » !« e » !

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) )

x <- vx <- vacc <- eacc <- e

while ( while ( ( x ) )( x ) ) acc <- h( acc , acc <- h( acc , ( x ) )( x ) ) x <- x <- ( x )( x )

res <- h( acc , a( x ) )res <- h( acc , a( x ) )

Code itératif raisonnable !Code itératif raisonnable !

Page 177: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 177177

x <- vx <- v

si ( si ( ( x ) )( x ) ) res <- a( x )res <- a( x )sinonsinon acc <- acc <- ( x )( x ) x <- x <- ( x )( x ) while ( while ( ( x ) )( x ) ) acc <- h( acc , acc <- h( acc , ( x ) )( x ) ) x <- x <- ( x )( x )

res <- h( acc , a( x ) )res <- h( acc , a( x ) )

Un appel récursif --- résuméUn appel récursif --- résumé----------------------------------------------------------------------------------------------------------------------------------

• 3) Appel récursif avec enveloppe associative, sans 3) Appel récursif avec enveloppe associative, sans neutre !neutre !

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) )

Code itératif à peu près raisonnable !Code itératif à peu près raisonnable !

Page 178: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 178178

Un appel récursif --- résuméUn appel récursif --- résumé----------------------------------------------------------------------------------------------------------------------------------

• 4) Appel récursif avec enveloppe non associative !4) Appel récursif avec enveloppe non associative !

res <- f( v )res <- f( v )

f ( x ) =f ( x ) = si ( si ( ( x ) )( x ) ) a( x )a( x ) sinonsinon h( h( ( x ) , f( ( x ) , f( ( x ) ) )( x ) ) )

Code itératif non raisonnableCode itératif non raisonnableà cause de la gestion de pile !à cause de la gestion de pile !

p <- I()p <- I()x <- vx <- v

while ( while ( ( x ) )( x ) ) p <- E( p <- E( ( x ) , p )( x ) , p ) x <- x <- ( x )( x )

res <- a( x )res <- a( x )

while ( while ( V( p ) ) V( p ) ) res <- h( S( p ) , res )res <- h( S( p ) , res ) p <- D( p )p <- D( p )

Page 179: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 179179

Dérécursion (début) :Dérécursion (début) :

Équivalences entreÉquivalences entre

programmes récursifsprogrammes récursifs

etet

programmes itératifs avec ou sans gestion de pile.programmes itératifs avec ou sans gestion de pile.

SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------------

Page 180: Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.

27 novembre 200627 novembre 2006 Cours d'algorithmique 7 - IntranetCours d'algorithmique 7 - Intranet 180180

m E r C i e Tm E r C i e Tb O n N e J o U r N é b O n N e J o U r N é

E ! ! !E ! ! !

n ‘ O u B l I e Z p A s D en ‘ O u B l I e Z p A s D ep R é P a R e R v O sp R é P a R e R v O s

T D ! ! !T D ! ! !