1. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
R´cursivit´
e e
I3 - Algorithmique
Nicolas Delestre
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 1 / 23
2. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
Plan
1 Introduction
2 Comment ´crire un algorithme r´cursif ?
e e
3 Quelques exemples
Les tours de Hano¨ı
Remplir une zone graphique
´
Evaluation d’une expression arithm´tique
e
4 Conclusion
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 2 / 23
3. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
Introduction
D´finition
e
Une entit´ est r´cursive lorsqu’on
e e
l’utilise pour la d´finir
e
Drawing Hands, Escher (1948)
http://www.russie.net/russie/art_
matriochka.htm
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 3 / 23
4. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
Exemples 1 / 2
Factorielle
0! = 1! = 1
n! = n(n − 1)!
Suite de fibonacci
F (0) = 0
F (1) = 1
F (n) = F (n − 1) + F (n − 2), n > 1
Poup´e russe
e
Une poup´e russe est
e
une poup´e “pleine”
e
une poup´e “vide” contenant une poup´e russe
e e
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 4 / 23
5. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
Exemples 2 / 2
Factorielle
fonction fact (n : Naturel) : Naturel
debut
si n=0 ou n=1 alors
retourner 1
sinon
retourner n*fact(n-1)
finsi
fin
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 5 / 23
6. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
R´cursivit´ terminale
e e
D´finition
e
L’appel r´cursif est la derni`re instruction et elle est isol´e
e e e
plus(a,b)
fonction plus (a,b : Naturel) : natuel
debut
si b=0 alors
retourner a
sinon
retourner plus(a+1,b-1)
finsi
fin
plus(4,2)=plus(5,1)=plus(6,0)=6
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 6 / 23
7. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
R´cursivit´ non terminale
e e
D´finition
e
L’appel r´cursif n’est pas la derni`re instruction et/ou elle n’est pas isol´e
e e e
(fait partie d’une expression)
plus(a,b)
fonction plus (a,b : Naturel) : natuel
debut
si b=0 alors
retourner a
sinon
retourner 1+plus(a,b-1)
finsi
fin
plus(4,2)=1+plus(4,1)=1+1+plus(4,0)=1+1+4=6 as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 7 / 23
8. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
M´thode
e
Pour ´crire un algorithme r´cursif il faut analyser le probl`me pour :
e e e
identifer le ou les cas particuliers
identifier le cas g´n´ral qui effectue la r´cursion
e e e
Surtout
Lorsque l’on ´crit un algorithme r´cursif, lors de l’appel r´cursif, on se
e e e
positionne en tant qu’utilisateur de l’algorithme : on consid`re donc que
e
le probl`me est r´solu
e e
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 8 / 23
9. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
Les tours de Hano¨ 1 / 4
ı
Pr´sentation
e
Les tours de hano¨ est un jeu solitaire dont l’objectif est de d´placer les
ı e
disques qui se trouvent sur une tour (par exemple ici la premi`re tour,
e
celle la plus ` gauche) vers une autre tour (par exemple la derni`re, celle
a e
la plus ` droite) en suivant les r`gles suivantes :
a e
on ne peut d´placer que le disque se trouvant au sommet d’une tour ;
e
on ne peut d´placer qu’un seul disque ` la fois ;
e a
un disque ne peut pas ˆtre pos´ sur un disque plus petit.
e e
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 9 / 23
10. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
Les tours de Hano¨ 2 / 4
ı
Op´rations disponibles
e
proc´dure d´pilerTour ( E/S t : TourDeHanoi , S d : Disque )
e e
proc´dure empilerTour ( E/S t : TourDeHanoi , E d : Disque )
e
Objectif
proc´dure resoudreToursDeHanoi ( E nbDisquesADeplacer : Naturel ,
e
E/S source, destination, intermediaire : TourDeHanoi )
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 10 / 23
11. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
Les tours de Hano¨ 3 / 4
ı
Analyse du probl`me
e
2
1 3
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 11 / 23
12. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
Les tours de Hano¨ 4 / 4
ı
Solution
proc´dure resoudreToursDeHanoi ( E nbDisquesADeplacer : Naturel , E/S source,
e
destination, intermediaire : TourDeHanoi )
D´claration d : Disque
e
debut
si nbDisquesADeplacer>0 alors
resoudreToursDeHanoi(nbDisquesADeplacer-1, source, intermediaire,
destination)
depiler(source,d)
empiler(destination,d)
resoudreToursDeHanoi(nbDisquesADeplacer-1, intermediaire, destination,
source)
finsi
fin
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 12 / 23
13. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
Remplir une zone graphique 1 / 5
Pr´sentation
e
Un ´cran graphique est un quadrillage
e
Chaque intersection de ce quadrillage est un pixel qui peut ˆtre
e
coloris´
e
Op´rations disponibles
e
proc´dure fixerCouleurPixel ( E/S e : Ecran , E x,y : Naturel , c : Couleur)
e
fonction obtenirCouleurPixel (e : Ecran,x,y : Naturel) : Couleur as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 13 / 23
14. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
Remplir une zone graphique 2 / 5
Objectif
Proposer le corps de la proc´dure suivante qui permet de remplir
e
une zone
proc´dure remplir ( E/S e : Ecran , E x,y : Naturel , ancienneCouleur,
e
nouvelleCouleur : Couleur)
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 14 / 23
15. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
Remplir une zone graphique 3 / 5
Analyse du probl`me
e
Remplir une zone consiste ` changer la couleur de certains pixels en
a
commen¸ant par celui qui est donn´ :
c e
Si le pixel de coordonn´e (x, y ) est d’une couleur diff´rente de
e e
ancienneCouleur
Ne rien faire
Si le pixel de coordonn´e (x, y ) est de la mˆme couleur que
e e
ancienneCouleur
Changer la couleur de ce pixel
Tenter de changer la couleur (remplir) des points qui se trouvent
autour
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 15 / 23
16. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
Remplir une zone graphique 4 / 5
Solution
proc´dure remplir ( E/S e : Ecran , E x,y : Naturel , ancienneCouleur,
e
nouvelleCouleur : Couleur)
debut
si obtenirCouleurPixel(e,x,y)=ancienneCouleur alors
fixerCouleurPixel(e,x,y,nouvelleCouleur)
remplir(e,x,y-1,ancienneCouleur,nouvelleCouleur)
remplir(e,x,y+1,ancienneCouleur,nouvelleCouleur)
remplir(e,x-1,y,ancienneCouleur,nouvelleCouleur)
remplir(e,x+1,y,ancienneCouleur,nouvelleCouleur)
finsi
fin
Note
On pourrait am´liorer l’algorithme en v´rifiant qu’on ne “sort” pas de
e e
l’´cran
e
as Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 16 / 23
17. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
Remplir une zone graphique 5 / 5
Exemple d’ordre de changements de couleur des pixels
On consid`re que le (0,0) est en haut ` gauche :
e a
2
9 1 7
8 3 6
4 5
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 17 / 23
18. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
´
Evaluation d’une expression arithm´tique 1 / 5
e
Pr´sentation
e
Il y a plusieurs fa¸on de noter une expression arithm´tique
c e
Infixe : 2*(3+5)
Pr´fixe (ou notation polonaise) : * 2 + 3 5
e
Postfixe (ou notation polonaise invers´e) : 3 5 + 2 *
e
En s’inspirant de la notation pr´fixe on peut repr´senter une
e e
expression aritm´tique ` l’aide d’un tableau tel que la i`me case
e a e
peut contenir :
un nombre
un op´rateur et dans ce cas les op´randes sont ` la position 2i et
e e a
2i + 1
* 2 + 3 5
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 18 / 23
19. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
´
Evaluation d’une expression arithm´tique 2 / 5
e
Objectif
En supposant que l’on ait :
Type Expression = Tableau[1..MAX] de Terme
Type Operateur = {addition,soustraction,multiplication,division}
fonction estUneOperation (t : Terme) : Booleen
fonction obtenirOperation (t : Terme) : Operateur
fonction obtenirNombre (t : Terme) : Reel
Donner le corps de la fonction suivante qui calcule la valeur d’une
expression que l’on sait correctement form´e :
e
fonction evaluer (e : Expression) : Reel
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 19 / 23
20. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
´
Evaluation d’une expression arithm´tique 3 / 5
e
Analyse du probl`me
e
Une expression arithm´tique est :
e
soit un nombre,
soit une op´ration compos´e d’un op´rateur et de deux op´randes qui
e e e e
sont des expressions arithm´tiques
e
´
Evaluer une expression arithm´tique :
e
Si c’est un nombre, sa valeur est la valeur de ce nombre
Si c’est une op´ration, sa valeur est le calcul de cette op´ration en
e e
´valuant ses deux op´randes
e e
´
Evaluer une expression arithm´tique revient donc ` ´valuer le
e ae
contenu de la premi`re case du tableau
e
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 20 / 23
21. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
´
Evaluation d’une expression arithm´tique 4 / 5
e
Solution
fonction evaluer (e : Expression) : Reel
debut
retourner evaluerRecursivement(e,1)
fin
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 21 / 23
22. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
´
Evaluation d’une expression arithm´tique 5 / 5
e
Solution
fonction evaluerRecursivement (e : Expression, indice : Naturel) : Reel
D´claration v1,v2 : Reel
e
debut
si non estUneOperation(e[indice]) alors
retourner obtenirNombre(e[indice])
sinon
v1 ← evaluerRecursivement(e,2*indice)
v2 ← evaluerRecursivement(e,2*indice+1)
cas o` obtenirOperation(e[indice]) vaut
u
addition : retourner v1+v2
soustraction : retourner v1-v2
multiplication : retourner v1*v2
division : retourner v1/v2
fincas
finsi
fin
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 22 / 23
23. Introduction Comment ´crire un algorithme r´cursif ? Quelques exemples Conclusion
e e
Conclusion. . .
En conclusion
Les algorithmes r´cursifs sont simples (c’est simplement une autre
e
fa¸on de penser)
c
Les algortihmes r´cursifs permettent de r´soudre des probl`mes
e e e
complexes
Il existe deux types de r´cursivit´s :
e e
terminale, qui algorithmiquement peuvent ˆtre transform´e en
e e
algorithme non r´cursif
e
non terminale
Les algorithmes r´cursifs sont le plus souvent plus gourmands en
e
ressource que leurs ´quivalents it´ratifs
e e
as
Architecture des Systèmes d’Information
R´cursivit´ - v1.2
e e 23 / 23