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

Post on 03-Apr-2015

118 views 1 download

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

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.

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

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.

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.

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 ?

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 ?

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

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

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

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,

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,

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.

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

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

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

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

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

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

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

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

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

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 ».

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

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 ».

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 !

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

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 )

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 )

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

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

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 !

==

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

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

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

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 )

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 !

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

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 !

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 !

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 !

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 !

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 !

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 !

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 !

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

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

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

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

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

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

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 !

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

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.

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 !

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

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

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

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 !

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 !

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 !

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

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

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.

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

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.

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.

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

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

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

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.

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.

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.

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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 )

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 )

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 )

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

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

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

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

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

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

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

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 )

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 )

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 )

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

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

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

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

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

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

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 )

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

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

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 !

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 !

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 !

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 !

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é !

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é !

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

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

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

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

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

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 !

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

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

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

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

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

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

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

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 !

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 !

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

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

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

Sous forme d’arbre …Sous forme d’arbre …----------------------------------------------------------------------------------------------------------------------------------

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 )

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 !

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

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

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

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 !

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 !

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 !

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 !

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

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

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

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

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

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

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

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

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

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 !

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

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

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

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

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

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

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

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

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

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 )

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 )

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

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 !

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.

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 !

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 !

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 !

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 )

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 )

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 )

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

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 !

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 !

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 !

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 !

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 )

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

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