Vous êtes sur la page 1sur 61

Universit Paris XI

I.U.T. d'Orsay
Dpartement Informatique
Anne scolaire 2003-2004
Algorithmique : Volume 5
Rcursion
Listes rcursives
Arbres binaires
Ccile Balkanski, Nelly Bensimon, Grard Ligozat
iUT
ORSAY
Algorithmique 5 : Rcursion 1
Exemple 1: Calcul de la factorielle
fact(3) = 3 2 1
fact(N) = N fact(N -1) la fonction fait appel elle-mme
vrai pour N > 0
fact(0) = 1 condition d'arrt
1. Fonction fact(N) retourne (entier)
paramtre (D) N : entier
variable rsultat : entier
dbut
2. si (N = 0)
3. alors retourne (1)
4. sinon rsultat ( N fact(N-1) )
5. retourne (rsultat)
fsi
fin
Algorithmique 5 : Rcursion 2
Simulation
1
er
appel :
1. N1 = 3
2. (N1 = 0) ? faux
4. r1 3 * fact (2)
Principes d'criture pour la simulation
1. Numroter les instructions
1 : en-tte,
2 : instruction qui suit dbut,

k : instruction qui prcde fin


2. Indexer, par le niveau d'appel, les noms des paramtres et variables
3. Donner la trace de l'excution (avec flches indiquant les appels et les retours)
Exemple : fact(3)
Algorithmique 5 : Rcursion 3
Exemple 2: le PGCD de deux entiers
pgcd(A,B) = pgcd(B, A mod B) appel rcursif,
vrai pour B > 0
pgcd(A,0) = A condition d'arrt
1. Fonction pgcd(A,B) retourne (entier)
paramtres (D) A,B : entiers
variable rsultat : entier test darrt
dbut de la rcursion
2. si B = 0
3. alors retourner (A) appel
4. sinon rsultat pgcd(B, A mod B) rcursif
5. retourne (rsultat)
fsi
fin
Algorithmique 5 : Rcursion 4
Exemple 2: simulation
rponse pgcd(21, 12)
1
er
appel :
1. A
1
= 21, B
1
= 12
Algorithmique 5 : Rcursion 5
Exemple 3: recherche d'un lment
dans un tableau
Version itrative
Fonction recherche( val, tab, nbr) retourne (boolen)
paramtres (D) val, nbr : entiers
(D) tab : tableau [1, MAX] d'entiers
variables trouv : boolen ; cpt : entier
dbut
cpt 0 ; trouv FAUX
tant que (non trouv et cpt < nbr) faire
cpt cpt +1
trouv (tab[cpt] = val)
ftq
retourne(trouv)
fin
Algorithmique 5 : Rcursion 6
recherche(val, tab, nbVal)
- est-ce que val est la dernire valeur du tableau?
- si oui, fin (retourne Vrai), sinon, reprendre dans le
tableau sans la dernire valeur :
recherche(val,tab, nbVal -1)
appel rcursif, possible pour nbVal > 0
nbVal = 0 condition d'arrt
Ide d'une solution rcursive
Algorithmique 5 : Rcursion 7
Fonction recherche( val, tab, nbVal) retourne (boolen)
paramtres (D) val : entier
(D) tab : tableau [1, MAX] d'entiers
(D) nbVal : entier test darrt
dbut de la rcursion
si (nbVal = 0)
alors retourne (FAUX)
sinon si (tab[nbVal] = val)
alors retourne (VRAI)
sinon retourne (recherche( val, tab, nbVal - 1))
fsi
fsi appel
fin rcursif
Algorithmique 5 : Rcursion 8
Exemple 3: simulation
recherche(5, unTab, 4) unTab 1 5 8 2
1
er
appel :
1. val
1
=5, tab
1
=unTab, nbr
1
=4
Algorithmique 5 : Rcursion 9
version rcursive alternative
Comparer les enchanements rcursifs (trs inefficace)
Fonction recherche( val, tab, nbr) retourne (boolen)
paramtres (D) val : entier
(D) tab : tableau [1, MAX] d'entiers
(D) nbr : entier
dbut
si (nbr = 0)
alors retourne (FAUX)
sinon si (recherche( val, tab, nbr - 1))
alors retourne (VRAI)
sinon retourne (tab[nbr] = val)
fsi
fsi
fin
Algorithmique 5 : Rcursion 10
criture rcursive alternative
intressante en C++ ("valuation paresseuse"),
mais trs inefficace en algo
Fonction recherche( val, tab, nbr) retourne (boolen)
paramtres (D) val : entier
(D) tab : tableau [1, MAX] d'entiers
(D) nbr : entier
dbut
si (nbr = 0)
alors retourne (FAUX)
sinon retourne (tab[nbr] = val OU recherche( val, tab, nbr - 1))
fsi
fin
Algorithmique 5 : Rcursion 11
Exemple 4: inversion d'une chane de
caractres
Exemple : abcde
1. Enlever le premier caractre a
2. Inverser le reste de la chane edcb
appel rcursif
3. Rajouter le premier en fin de chane edcba
Condition d'arrt ?
Inverser une chane de longueur 1 = ne rien faire
Algorithmique 5 : Rcursion 12
Exemple 4: simulation
1
er
appel : inverser " algo"
1. enlever "a"
2. inverser "lgo"
3. rajouter "a"
Algorithmique 5 : Rcursion 13
Procdure d'inversion
Procdure inverser (mot, nbcar)
paramtres (D/R) mot : tableau [1, MAX] de caractres
(D) nbcar : entier
Algorithmique 5 : Rcursion 14
Exemple 5: les tours de hanoi
Problme :
transfrer les N disques de l'axe A l'axe C, en utilisant B, de sorte
que jamais un disque ne repose sur un disque de plus petit diamtre.
Ici : N = 5
A B C
Algorithmique 5 : Rcursion 15
Ide d'une solution rcursive
supposons que l'on sache rsoudre le problme pour (N-1) disques :
1. on dplace (N-1) disques de A vers B en utilisant C
2. on fait passer le N-ime grand disque en C {dplacer le plus grand}
3. on dplace les (N-1) disques de B vers C en utilisant A
c'est l'ide gnrale de la rcursion :
par exemple, si je sais calculer fact(N-1), je sais calculer fact (N)
{ rduction du problme, jusqu la condition darrt}
pour les tours de hanoi, le problme de taille N donne naissance deux
problmes de taille (N-1)
Algorithmique 5 : Rcursion 16
Squelette dune procdure rcursive
1. Procdure hanoi (source, but, aux, nb)
paramtres
dbut
2. si nb = 1
alors dplacer un disque de source vers but
3. sinon hanoi (source, aux, but, nb 1)
4. dplacer un disque de source vers but
5. hanoi (aux, but, source, nb 1)
fsi
fin
Algorithmique 5 : Rcursion 17
Simulation de hanoi(A,C,B,3)
[il manque les flches dappel et de retour!]
1
er
appel : hanoi(A,C,B,3)
1. Faux
3. hanoi(A,B,C,2)
4. dplacer 1 disque de A C
5. hanoi(B,C,A, 2)
2
me
appel : hanoi(A,B,C,2)
1. Faux
3. hanoi(A,C,B,1)
4. dplacer 1 disque de A B
5. hanoi(C,B,A,1)
3
me
appel : hanoi(A,C,B,1)
1. vrai
2. dplacer 1 disque de A C
4
me
appel : hanoi(C,B,A,1)
1. vrai
2. dplacer 1 disque de C B
5
me
appel : hanoi(B,C,A, 2)
1. Faux
3. hanoi(B,A,C,1)
4. dplacer 1 disque de B C
5. hanoi(A,C,B,1)
6
me
appel : hanoi(B,A,C,1)
1. vrai
2. dplacer 1 disque de B A
7
me
appel : hanoi(A,C,B,1)
1. vrai
2. dplacer 1 disque de A C
Algorithmique 5 : Rcursion 18
Simulation de hanoi(A,C,B,3)
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
A
B
C
Algorithmique 5 : Rcursion 19
Rcapitulation
Fonction rcursive ?
- Fonction qui sappelle elle-mme.
Comment viter les appels infinis ?
- Trouver le test qui va dterminer larrt.
Comment les crire?
- Dfinir le cas gnral : il contiendra lappel rcursif.
- Dfinir le cas particulier : cest le test darrt.
Algorithmique 5 : Rcursion 20
Un autre exemple de simulation
Procdure manipTableau(tab, val1, val2)
paramtres (D/R) tab : tableau[1:Max]
(D) val1: entier
(D/R) val2 : entier
dbut
si val1 0
alors manipTableau(tab, val1 1, val2)
si tab[val1] BLANC
alors val2 val2 + 1
tab[val2] tab[val1]
fsi
fsi
fin
Algorithmique 5 : Rcursion 21
Un dernier exemple
Soit un tableau de pixels deux dimensions N*N. On reprsente les pixels
allums laide de la valeur 1 et les pixels teints laide de la valeur 0.
Ecrire une fonction rcursive surfaceRgion qui prend en paramtres
(entre autres) les coordonnes x et y dun pixel et qui renvoie la surface de
la rgion laquelle appartient ce pixel. La surface est value ici en terme
de nombre de pixels allums. Une rgion est un ensemble de pixels
allums lis par continuit horizontale, verticale ou diagonale.
x
1 2 3 4 5
1
1 0 1 1 1
y
2
1 0 0 1 0
3
0 0 0 0 0
4
0 1 1 0 0
5
1 0 1 1 0
Exemple, ce tableau ci-contient 3 rgions
et surfaceRgion doit retourner
- 5 pour le point (3,4),
- 2 pour le point (1,2)
- 0 pour le point (5,5)
- 4 pour le point (5,1)
Algorithmique 5 : Listes rcursives 22
Listes rcursives
Algorithmique 5 : Listes rcursives 23
Nouvelle dfinition dune liste
Une liste, cest
- Soit une liste vide
- Soit une cellule suivie dune liste
Dfinition rcursive car une liste est dfinie par
une liste.
La rgle "soit une liste vide" assure larrt et
donc la cohrence de la dfinition
Algorithmique 5 : Listes rcursives 24
Dfinition de la classe
Liste Rcursive
Classe ListeRc
Attributs :
non explicits {vous tes utilisateurs de la classe}
Mthodes :
MFonction vide() {vrai si la liste est vide}
MFonction infoTte() {valeur enregistre dans la tte}
MFonction reste() {liste obtenue en enlevant la tte}
MFonction prfixer(val) {liste obtenue en insrant val en tte}
Algorithmique 5 : Listes rcursives 25
Mthodes
MFonction vide() retourne boolen
{Retourne vrai si la liste est vide, faux sinon}
paramtre (D) cible : ListeRc
MFonction infoTte() retourne Info
{Retourne la valeur enregistre dans la tte. Erreur si la liste est vide.}
paramtre (D) cible : ListeRc
MFonction reste() retourne ListeRc
{Retourne la liste obtenue en enlevant la tte. Erreur si la liste est vide.}
paramtre (D) cible : ListeRc
MFonction prfixer(val) retourne ListeRc
{Retourne la liste obtenue en insrant val en tte.}
paramtre (D) cible : ListeRc
Algorithmique 5 : Listes rcursives 26
Affichage d'une liste rcursive
Procdure afficherListe(uneListe)
{Affiche les valeurs contenues dans une liste.}
paramtre (D) uneListe : ListeRc
dbut
si non uneListe.vide() {test darrt}
alors afficher(uneListe.infoTte()) {traitement}
afficherListe(uneListe.reste()) {appel rcursif}
fsi
fin
Algorithmique 5 : Listes rcursives 27
Affichage: simulation
uneL
3
1
er
appel :
1. uneL
1
afficherListe(uneL)
1 7
Algorithmique 5 : Listes rcursives 28
Deux types de rcursion
Rcursion " descendante"
rcursion terminale
("fausse" rcursion)
rien au retour
traitement suivi de lappel rcursif
donnes nont pas besoin
dtre stockes
version itrative possible
Rcursion " ascendante"
rcursion non terminal
excution au retour, en remontant
appel rcursif suivi du traitement
donnes ont besoin dtre stockes
version itrative beaucoup plus difficile
Algorithmique 5 : Listes rcursives 29
Affichage dans lordre inverse
Procdure afficherInverse(uneListe)
{Affiche les valeurs contenues dans une liste dans lordre inverse.}
paramtre (D) uneListe : ListeRc
dbut
si non uneListe.vide() {test darrt}
alors afficherInverse(uneListe.reste()) {appel rcursif}
afficher(uneListe.infoTte()) {traitement}
fsi
fin
Algorithmique 5 : Listes rcursives 30
Affichage inverse : simulation
uneL
3
1
er
appel :
1. uneL
1
afficherInv(uneL)
1 7
Algorithmique 5 : Listes rcursives 31
Longueur dune liste rcursive
Fonction longueur(uneListe) retourne (entier)
{retourne le nombre de cellules faisant partie dans une liste.}
paramtre (D) uneListe : ListeRc
dbut
Algorithmique 5 : Listes rcursives 32
Longueur: simulation
uneL
3
1
er
appel :
1. uneL
1
longueur(uneL)
1
Algorithmique 5 : Listes rcursives 33
Inversion dune liste rcursive
Retourner l'exemple 4 , transparent 13
Cas particulier :
- Liste vide : ne rien faire (condition d'arrt)
Cas gnral :
1. Enlever la tte
2. Inverser le reste de la liste (appel rcursif)
3. Rajouter la tte en fin de liste
Algorithmique 5 : Listes rcursives 34
Fonction inverser(uneListe) retourne (ListeRc)
{retourne la liste inverse de la liste passe en paramtre.}
paramtre (D) uneListe : ListeRc
variables premier : Info
nouvListe : LISTE-REC
dbut
si uneListe.vide()
alors retourner (uneListe)
sinon premier uneListe.infoTte()
nouvListe inverser(uneListe.reste())
ajoutQueue(premier, nouvListe)
retourner(nouvListe)
fsi
fin
Algorithmique 5 : Listes rcursives 35
criture alternative :
Fonction inverser(uneListe) retourne (ListeRc)
{retourne la liste inverse de la liste passe en paramtre.}
paramtre (D) uneListe : ListeRc
dbut
si uneListe.vide()
alors retourner (uneListe)
sinon retourner (ajoutQueue (uneListe.infoTte(),
inverser(uneListe.reste()) )
fsi
fin
Algorithmique 5 : Listes rcursives 36
Fonction ajoutQueue(uneVal, uneListe) retourne (ListeRc)
{retourne la liste rsultant de lajout de uneVal en queue de uneListe.}
paramtre (D) uneVal : entier
(D) uneListe : ListeRc
Algorithmique 5 : Listes rcursives 37
ajoutQueue : simulation
uneL
3
1
er
appel :
1. uneL
1
ajoutQueue(uneL,1)
7
Algorithmique 5 : Listes rcursives 38
inverser : simulation
uneL
3
1
er
appel :
1. uneL
1
inverser(uneL)
1 7
Algorithmique 5 : Arbres binaires 39
Arbres binaires
Algorithmique 5 : Arbres binaires 40
Reprsentations arborescentes
Les arborescences sont utilises :
Dans la vide de tous les jours : pour reprsenter
des hirarchies, des classifications, des partitions
Dans le domaine de l'informatique : pour
reprsenter les informations ci-dessus, et aussi :
- L'organisation interne des fichiers en mmoire
- Les mode de calcul d'une expression
- L'organisation de donnes tries
Algorithmique 5 : Arbres binaires 41
Exemple :
Animal
Mammifre Oiseau Poisson
Chat
Chien
Souris Canari Merle Requin
Eperlan
Truite
Tom Mdor Jerry
Signification du lien :
- du plus gnrique au plus spcifique
Autres significations possibles :
- du plus ancien au plus rcent
- de la plus haute autorit la moindre
- du plus complexe au plus simple
Algorithmique 5 : Arbres binaires 42
Comment caractriser un arbre?
Par sa racine
Par ses sommets
Par les arcs reliant les sommets entre eux
Par ses feuilles
feuilles
sommets
racine
arc
Profondeur = 3
Algorithmique 5 : Arbres binaires 43
Dfinition rcursive
dun arbre binaire
Un arbre binaire, cest
- Soit un arbre binaire vide
- Soit une racine avec deux sous-arbres binaires (appels fils
gauche et fils droit)
Dfinition rcursive car un arbre binaire est dfini par
un arbre binaire.
La rgle "soit un arbre binaire vide" assure larrt et
donc la cohrence de la dfinition.
Algorithmique 5 : Arbres binaires 44
Dfinition de la classe ArbreBinaire
Classe ArbreBinaire
Attributs :
non explicits {vous tes utilisateurs de la classe}
Mthodes :
MFonction vide() {vrai si larbre binaire est vide}
MFonction info() {valeur enregistre la racine}
MFonction filsG() {"fils gauche" : sous arbre gauche}
MFonction filsD() {"fils droit" : sous arbre droit}
Algorithmique 5 : Arbres binaires 45
Mthodes
MFonction vide() retourne boolen
{Retourne vrai si larbre binaire est vide, faux sinon}
paramtre (D) cible : ArbreBinaire
MFonction info() retourne Info
{Retourne la valeur enregistre dans la racine. Erreur si larbre est vide.}
paramtre (D) cible : ArbreBinaire
MFonction filsG() retourne ArbreBinaire
{Retourne larbre binaire form par le sous arbre gauche (fils gauche).
Erreur si larbre binaire est vide.}
paramtre (D) cible : ArbreBinaire
MFonction filsD() retourne ArbreBinaire
{Retourne larbre binaire form par le sous arbre droit (fils droit).
Erreur si larbre binaire est vide.}
paramtre (D) cible : ArbreBinaire
Algorithmique 5 : Arbres binaires 46
Affichages : ordres possibles
Soit larbre binaire suivant :
3
3
0
1
5
8
4
9
7
2
6
Affichage
- ordre prfixe : 3 3 7 4 8 0 1 5 2 6 7 9 (racine dabord)
- ordre suffixe : 4 8 7 3 1 6 7 2 9 5 0 3 (racine en dernier)
- ordre infixe : 4 7 8 3 3 1 0 6 2 7 5 9 (racine au milieu)
7
Algorithmique 5 : Arbres binaires 47
Affichage : ordre prfixe
Procdure affichePrfixe (unArbre)
{Affiche les valeurs portes par les sommets de l'arbre binaire, en affichant la
valeur porte par la racine avant les valeurs portes par les sous-arbres
gauche et droit}
paramtre (D) unArbre : ArbreBinaire {supposons TypInfo = rel}
dbut
si non unArbre.vide()
alors afficher (unArbre.info())
affichePrfixe (unArbre.filsG())
affichePrfixe (unArbre.filsD())
fsi
fin
Algorithmique 5 : Arbres binaires 48
Affichage : simulation
Algorithmique 5 : Arbres binaires 49
Affichage : ordre suffixe
Procdure afficheSuffixe (unArbre)
{Affiche les valeurs portes par les sommets de l'arbre binaire, en affichant la
valeur porte par la racine aprs les valeurs portes par les sous-arbres
gauche et droit}
paramtre (D) unArbre : ArbreBinaire {supposons TypInfo = rel}
dbut
si non unArbre.vide()
alors afficheSuffixe(unArbre.filsG())
afficheSuffixe (unArbre.filsD())
afficher (unArbre.info())
fsi
fin
Algorithmique 5 : Arbres binaires 50
Affichage : ordre Infixe
Procdure afficheInfixe (unArbre)
{Affiche les valeurs portes par les sommets de l'arbre binaire, en affichant
la valeur porte par la racine entre les valeurs portes par les sous-arbres
gauche et droit}
paramtre (D) unArbre : ArbreBinaire {supposons TypInfo = rel}
dbut
si non unArbre.vide()
alors afficheInfixe (unArbre.filsG())
afficher (unArbre.info())
afficheInfixe (unArbre.filsD())
fsi
fin
Algorithmique 5 : Arbres binaires 51
Nombre de sommets d'un arbre binaire
Cas particulier : arbre vide : rsultat = 0
Cas gnral : 1 (sommet de larbre courant)
+ nb sommets dans FG
+ nb sommets dans FD
Fonction compteSommets(unArbre) retourne entier
{retourne le nombre de sommets de l'arbre binaire}
paramtre (D) unArbre : ArbreBinaire {supposons TypInfo = rel}
dbut
si unArbre.vide()
alors retourne (0)
sinon retourne (1 +compteSommets (unArbre.filsG())
+compteSommets (unArbre.filsD()))
fsi
fin
Algorithmique 5 : Arbres binaires 52
Application :
arbres binaires de recherche (ABR)
Un arbre binaire de recherche est un arbre binaire
dans lequel la valeur de chaque sommet est
- suprieure [ou gale] toutes les valeurs tiquetant les
sommets du sous-arbre gauche de ce sommet,
- et infrieure toutes les valeurs tiquetant les sommets
du sous-arbre droit de ce sommet.
Algorithmique 5 : Arbres binaires 53
Algorithme de construction dun ABR
Soit val la valeur placer dans lABR
(lajout se fera toujours sur une feuille : arbre binaire dont le FG et le FD
sont vides)
- Si larbre est vide, en crer un, rduit sa racine, tiquete avec val
- Sinon si val valeur porte par la racine,
alors lajouter au sous-arbre gauche : si cet arbre nest pas vide,
reprendre lalgorithme sur ce sous-arbre
Sinon lajouter au sous-arbre droit : si cet arbre nest pas vide,
reprendre lalgorithme sur ce sous-arbre
Algorithmique 5 : Arbres binaires 54
Construction dun ABR : simulation
12 45 -34 0 23 18 19 56 12 18 45
Algorithmique 5 : Arbres binaires 55
Ajout dune valeur dans un ABR
MProcdure ajout(uneVal)
{ajoute une valeur un arbre binaire de recherche}
paramtres (D) uneVal : entier
(D/R) cible : ABR
dbut
si cible.vide()
alors cible.cration(val)
sinon si uneVal cible.info()
alors (cible.filsG()).ajout(uneVal)
sinon (cible.filsD()).ajout(uneVal)
fsi
fsi
fin
MProcdure cration(uneVal)
{cre un arbre binaire rduit sa racine et y affecte unVal}
paramtre (R) cible : ArbreBinaire
(D) uneVal : entier
Algorithmique 5 : Arbres binaires 56
Ajout : simulation
Algorithmique 5 : Arbres binaires 57
Utilisation dun ABR : trier une liste
Liste arbre binaire de recherche affichage liste trie
construire
Arbre binaire
afficher arbre
Ordre infixe
dbut
uneListe.saisirListe()
construireABR(uneListe, unABR)
afficheInfixe(unABR)
fin
Algorithmique 5 : Arbres binaires 58
Construire un ABR partir dune liste
Procdure construireABR(uneListe, unABR)
{construit un arbre binaire de recherche partir dune liste}
paramtre (D) uneListe : LISTE-Rec
(D/R) unABR : ArbreBinaire {supposons TypInfo = entier}
dbut
si non uneListe.vide()
alors
val uneListe.infoTte()
unABR.ajout(val)
construireABR(uneListe.reste(), unABR)
fsi
fin
Algorithmique 5 : Arbres binaires 59
Trier une liste : simulation
Algorithmique 5 60
fin Volume 5

Vous aimerez peut-être aussi