cours d'algorithmique 7 - intranet 1 27 novembre 2006 cours dalgorithmique dérécursion...
TRANSCRIPT
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 ! ! !