Vous êtes sur la page 1sur 32

Complexité et structures des

données
Semestre 2
Elaboré par Mme Elkamel Hager
Jamoussi.hager@gmail.com

FSM de Monastir 2021-2022


1ere année Licence en Sciences de l’Informatique

H. Jamoussi Elkamel , FSM 1


Complexité et ASD

Plan du cours

Chapitre 1 : Les enregistrements


Chapitre 2 : la récursivité et le paradigme diviser
pour régner
Chapitre 3 : Analyse et complexité des algorithmes
Chapitre 4 : Les pointeurs
Chapitre 5 : Les Listes chainées
Chapitre 6 : Les Types Abstraits des données
Chapitre 7 : Les piles
Chapitre 8 : Les Files
Chapitre 9 : Les Arbres
Chapitre 10 : Les Arbres binaires de recherche
Complexité et ASD H. Jamoussi Elkamel , FSM 2

1
Chapitre 2

La récursivité et le paradigme
« diviser pour régner »

Complexité et ASD H. Jamoussi Elkamel , FSM

Sommaire
• Introduction
• Objets récursifs
• Méthodes récursives
– définition
– Propriétés d’une méthode récursive
– Exemple : tour de Hanoï
• Type de récursivité
• Pile d’exécution
• Arbre d’exécution
• Le paradigme « diviser pour régner »
– Principe
– Tri fusion
• Conclusion

Complexité et ASD H. Jamoussi Elkamel , FSM 4

2
Le principe de récursivité
• La récursivité : est l’art d’écrire des algorithmes qui
résolvent des problèmes que l’on ne sait pas résoudre
directement.

• Certains problèmes se résolvent simplement en résolvant


un sous problème de même nature, mais plus simple…

• La récursivité permet de définir un concept (un objet ou


une méthode) en fonction de lui-même.

H. Jamoussi Elkamel , FSM 5


Complexité et ASD

Le principe de récursivité
• On trouve :
– Des objets récursifs : (structures de données ou TAD),
– Des méthodes récursives : (procédures et fonctions).

• Tout objet est dit récursif s’il se définit à partir de lui-


même
• Une fonction ou une procédure est dite récursive si elle
comporte, dans son corps, au moins un appel à elle-
même
• Une structure est récursive si un de ses attributs en est
une autre instance 6
Complexité et ASD H. Jamoussi Elkamel , FSM

3
Objets récursifs
• Il est parfois difficile de définir un objet directement,
• Mais, il est plus simple de définir l’objet en
fonction de lui-même.
Exemple : chaîne de caractère
a) Définition classique: une chaine de caractères est une
suite de caractères.
b) Définition récursive : une chaîne de caractères est :
• soit la chaîne vide;
• soit un caractère suivi d’une chaîne de caractères

 La récursivité est un mécanisme puissant de définition d’objets!


H. Jamoussi Elkamel , FSM 7
Complexité et ASD

Objets récursifs
• Dans la définition d’un objet récursif, on a besoin
d’un :
• objet particulier qui représente un point d’appui
permettant de limiter le nombre d’objets dans la définition.
• D’un processus de décomposition en un ou plusieurs
objet(s) récursif(s)

• D’une manière générale un objet récursif est :


• Soit un objet particulier;
• Soit une composante + un (ou plusieurs) objet(s)
récursif(s).
Complexité et ASD H. Jamoussi Elkamel , FSM 8

4
Exemple d’Objets récursifs
• Une Liste est
• Soit une liste vide
• Soit un élément en entête suivie par une Liste

• Une expression arithmétique est :


• Soit une valeur
• Soit une variable
• Soit une expression arithmétique , un opérateur et une
autre expression arithmétique

H. Jamoussi Elkamel , FSM 9


Complexité et ASD

Objets récursifs
• Une Expression logique est
• Soit une constante
• Soit une variable propositionnelle
• Soit Expression logique
• Soit Expression logique  Expression logique
• Soit Expression logique  Expression logique

• Un Arbre Binaire est


• Soit c’est un arbre vide ;
• Soit c’est un élément et 2 sous Arbre Binaire

Complexité et ASD H. Jamoussi Elkamel , FSM 10

5
Méthode récursive
• Définition: une méthode est récursive si elle fait appel
à elle-même d’une manière directe ou indirecte.
• Une méthode récursive traduit, généralement, une
définition récursive d’un traitement.
Exemple : factoriel
a) Définition classique: n! = n (n-1)…. 21
b) Définition Récursive:

n!= 1 si n = 0
n  (n-1)! si n > 0
• Pour avoir un nombre d’appel fini d’une méthode récursive, il faut définir une
condition d’arrêt (cas de base) qui sera vraie à un instant ultérieur de l’exécution.
Complexité et ASD H. Jamoussi Elkamel , FSM

Propriétés d’une Méthode récursive


Dans la définition d’une méthode récursive on a
besoin
1. D’une condition d’arrêt qui permet à l’appel
récursif d’une méthode de s’arrêter à un
moment donné. Autrement, l’exécution va
continuer indéfiniment.

2. Un processus de réduction où à chaque appel


de lui-même, il se rapproche de la condition
d’arrêt.
Complexité et ASD H. Jamoussi Elkamel , FSM 12

6
Processus de réduction
• Le processus de réduction permet de réduire la taille d’un
problème
• La taille d’un problème est une caractéristique du problème, elle
dépend de la nature du problème! C’est un ou plusieurs paramètres
données
o Pour la récursion sur des entiers : la taille du problème est
définie par un entier, on réduit la valeur de cet entier à chaque
appel récursif. Exemple factoriel, les suites ..
o Pour la récusion sur les tableaux :
 Soit on considère la taille du tableau, on réduit la taille du
tableau considéré à chaque appel récursif
 Ou bien on utilise un ou des indices qui varient à chaque
appel pour tendre vers la condition d'arrêt (dépendant des
valeurs des indices).
H. Jamoussi Elkamel , FSM 13
Complexité et ASD

Principe de la récursive
Pour trouver une solution à un problème d’une manière
récursive
• on cherche à le décomposer en plusieurs sous-
problèmes de même nature mais de taille inférieure
(réduire la taille du problème considéré).

• Se ramener à un ou plusieurs problèmes simples


appelés cas de base et qui constituent la condition
d’arrêt.

Complexité et ASD H. Jamoussi Elkamel , FSM 14

7
Construire une Méthode récursive
La méthode générale étant la suivante :
1. On détermine les éléments dont dépend la solution et qui
caractérisent la taille du problème
2. Recherche d’un cas trivial (point d’arrêt) de sa solution
pour laquelle aucun appel récursif n’est effectué
la condition d’arrêt est obligatoirement au début de toute
méthode récursive
3. Décomposition du cas général en cas plus simples, eux
mêmes décomposables pour aboutir au cas trivial c’est-à-
dire trouver un processus de réduction du problème en
un ou plusieurs sous problèmes
H. Jamoussi Elkamel , FSM 15
Complexité et ASD

Schéma général d’un algorithme récursif


On distingue dans un algorithme récursif A deux parties
1. Cas de base
2. Celle qui contient au moins un appel à A
procedure A(p1, p2.. pn)
Debut,
Si cond
alors I1
Sinon I2
A( f(p1, p2, .. pn) )
I3
A( g(p1, p2, .. pn) )
Im
Finsi
Fin. 16
Complexité et ASD H. Jamoussi Elkamel , FSM

8
Récursivité terminale et récursivité non terminale

On dit qu’un appel récursif à A est terminal, si et seulement si cet appel


n’est jamais suivi par l’exécution d’une ou plusieurs instructions de A. .)

procedure A(p1, p2.. pn) procedure A(p1, p2.. pn)


Debut, Debut,
Si cond Si cond
alors I1 alors I1
Sinon I2 Sinon I2
A(f(p1, p2, .. pn)) A(f(p1, p2, .. pn))
Finsi Im
Fin. Finsi
Fin.

Récursivité simple terminale Récursivité simple non terminale


H. Jamoussi Elkamel , FSM 17
Complexité et ASD

Exemple d’une méthode récursive


Ecrire un algorithme qui calcule la factorielle d’un entier n
Problème facto
Entrée : un entier n
Précondition (n ≥ 0)
Sortie : un entier p= n!

1. taille du problème : n entier


2. Cas trivial (cas de base )
si n = 0 n! = 1
2. Processus de réduction
Pour résoudre un problème de taille n on résout un problème de taille (n-1)
si ( n > 0) n! = n* (n-1)!
Complexité et ASD H. Jamoussi Elkamel , FSM 18

9
Exemple d’une méthode récursive

Précondition : (n ≥ 0) Ici quand n vaut 0, on


s’arrête
Fonction fact ( n : Entier) : Entier
Debut Problème : arrive-t-on
Si (n = 0) à n = 0 ? La condition
Alors Retourner (1) terminale ne sert à rien
Sinon si elle ne devient
Retourner ( n* fact(n-1)) jamais vraie.
FinSi
Fin fact(-2) donne une
exécution à l’infini
H. Jamoussi Elkamel , FSM 19
Complexité et ASD

Propriétés d’une Méthode récursive


Attention !

 Il faut toujours s'assurer que chaque cas général


converge vers un cas de base.
 Une méthode récursive doit comporter :
• Un cas d’arrêt dans lequel aucun autre appel n’est
effectué
• Un cas général dans lequel un ou plusieurs autres
appels sont effectués
 la chaîne d’appel doit conduire à la condition d’arrêt

Complexité et ASD H. Jamoussi Elkamel , FSM 20

10
Propriétés d’une Méthode récursive
Exemple:
fonction mystere (n: entier, y: entier): entier
Debut
Si (n= 0)
alors retourner (y)
sinon retourner (mystere (n +1,y))
Finsi
Fin.
Pour (n > 0), la condition d’arrêt ne pourra pas être
atteinte.
H. Jamoussi Elkamel , FSM 21
Complexité et ASD

Exemple d’une méthode récursive


Ecrire un algorithme qui calcule la puissance d’un nombre réel a par
un entier n

Problème Puissance
Entrée : un réel a et un entier n
précondition a ≠ 0 et (n ≥ 0)

Sortie : le réel an

Taille du problème : n : entier représente la puissance

Complexité et ASD H. Jamoussi Elkamel , FSM 22

11
Exemple d’une méthode récursive
Problème Puissance
Entrée : un réel a ≠ 0 et un entier n ≥ 0
Sortie : le réel an
Solution 1

1. taille du problème : n entier : c’est la puissance


2. Cas trivial (cas de base )
n=0 a0 = 1
2. Processus de réduction
si (n > 0) Pour résoudre un problème de taille n on résout un problème de taille n-1
an = a .a (n-1)
H. Jamoussi Elkamel , FSM 23
Complexité et ASD

Exemple d’une méthode récursive

Précondition : (a ≠ 0 ) et (n ≥ 0)
Fonction puissance (a, n : Entier) : Entier
Debut
Si (n = 0)
Alors Retourner (1)
Sinon
Retourner ( a* puissance(a, n-1))
FinSi
Fin

Complexité et ASD H. Jamoussi Elkamel , FSM 24

12
Exemple d’une méthode récursive
Problème Puissance
Entrée : un réel a ≠ 0 et un entier (n ≥ 0)
Sortie : le réel an
Solution 2

1. taille du problème : n : un entier c’est la puissance


2. Cas trivial (cas de base
n=0 an = 1
3. processus de réduction
n
Si (n> 0)
• Si n est pair
n
a  (a )  ( a n div 2 ) 2
2 2

n 1

n est impair a  a * (a )  a * (a n div 2 ) 2


n 2 2
• Si
H. Jamoussi Elkamel , FSM 25
Complexité et ASD

Exemple d’une méthode récursive


Précondition : (a ≠ 0 ) et (n ≥ 0)
Fonction puissance (a, n : Entier) : Entier
Debut
Si (n = 0)
Alors Retourner (1)
Sinon
Si (n mod 2 = 0 )
Alors Retourner (CARRE (puissance(a, n/2)))
Sinon Retoruner (a × CARRE (puissance(a, (n-1)/2)))
FinSi
FinSi
Fin
Complexité et ASD H. Jamoussi Elkamel , FSM 26

13
Exemple d’une méthode récursive
Précondition : (a ≠ 0 ) et (n ≥ 0)
Fonction puissance (a, n : Entier) : Entier
Debut
Si (n = 0)
Alors Retourner (1)
Sinon
Si (n mod 2 = 0 )
Alors Retourner (CARRE (puissance(a, n div 2)))
Sinon Retoruner (a × CARRE (puissance(a, n div 2)))
FinSi
FinSi
Fin
H. Jamoussi Elkamel , FSM 27
Complexité et ASD

Exemple d’une méthode récursive


Problème Puissance
Entrée : un réel a ≠ 0 et un entier (n ≥ 0)
Sortie : le réel an
Solution 3

1. taille du problème n : un entier c’est la puissance


2. Cas trivial (cas de base
si (n = 0) an = 1
si (n=1 ) an = a
3. processus de réduction (n>0)
si n est premier an = a* a(n-1)
si n=p  k avec p est le plus petit diviseur premier de n
an = (ap)k
Complexité et ASD H. Jamoussi Elkamel , FSM 28

14
Exemple d’une méthode récursive
Fonction puissance (a, n : Entier) : Entier
var p,k: entier
Debut
Si (n = 0) Alors Retourner (1)
Sinon Si (n=1) alors retourner( a)
sinon si (estpremier(n))
Alors Retourner ( a* puissance(a, n-1))
Sinon decomposer(n, p, k)
Retoruner( puissance(puissance(a, p) , k))
Finsi
FinSi
FinSi
H. Jamoussi Elkamel , FSM 29
Fin
Complexité et ASD

Exemple: Tours de Hanoï

• Une légende orientale dit que la fin du monde surviendra quand sera
achevé le déplacement d’une tour de 64 disques d’or, installée lors de
la création du monde. À raison d’un mouvement par seconde, il y
faudrait 584 milliards d’années…

Complexité et ASD H. Jamoussi Elkamel , FSM 30

15
Exemple: Tours de Hanoï
• Entrées: 3 tours A, B et C; n disques concentriques

A B C
• Problème : déplacer les n disques de A (tour de départ) à B
(tour de destination) en s’aidant de C (tour intermédiaire)
• Règles :
– 1 seul disque peut être déplacé à la fois
– 1 disque ne peut jamais être déposé sur un plus petit
– 1 disque ne peut être déposé que sur A, B ou C
H. Jamoussi Elkamel , FSM 31
Complexité et ASD

Tour de Hanoï
Spécification du problème
Problème Hanoi
Entrée : un entier n (nombre de disque)
3 caractères A, B, C ( nom de tours)
précondition: (n ≥ 0 )

Sortie : affichage de déplacements réalisés

Taille du problème : n (le nombre de disques à déplacer)

Complexité et ASD H. Jamoussi Elkamel , FSM 32

16
Tour de Hanoï
idée de la solution récursive
• exprimer le problème des n disques à l ’aide de la même
solution sur n-1 disques
• (cas de base) savoir résoudre le problème pour 1 disque et
pour n= 0

H. Jamoussi Elkamel , FSM 33


Complexité et ASD

Tour de Hanoï
• Cas de base
Si n=0 aucun déplacement
Si n=1 déplacer le disque de A vers B

• Décomposition du problème (si n >1)

– Déplacer récursivement (n-1) disques de A vers C en s’aidant de B

– Afficher le déplacement d’un disque de A vers B

– Déplacer récursivement (n-1) disques de C vers B en s’aidant de A

Complexité et ASD H. Jamoussi Elkamel , FSM 34

17
Tour de Hanoï
procedure Hanoi(n : entier; A , B, C: caractère)
debut
Si (n=1)
alors ecrire ("déplacer un disque de " , A, " vers ", B)
Sinon
si (n>1)
alors
Hanoi(n-1, A, C, B)
ecrire("déplacer un disque de ", A, " vers ", B)
Hanoi(n-1, C, B, A)
Finsi
Finsi
Fin.
H. Jamoussi Elkamel , FSM 35
Complexité et ASD

le paradigme « diviser pour régner »


• Un paradigme est une méthode générale pour résoudre une
classe des problèmes.
• Le paradigme Diviser pour régner : est le principe
fondamental pour résoudre des problèmes complexes en
fournissant une méthode récursive.
• Idée: résoudre un problème I(n) de taille n
 en le divisant en une ou plusieurs sous-problèmes I(n1),
I(n2), …I(nk) de même nature, mais de tailles moindres
(ni <n  i),
 puis résoudre les sous- problèmes de la même manière
 ensuite combiner les solutions pour obtenir une solution
au problème initial I(n).
Complexité et ASD H. Jamoussi Elkamel , FSM 36

18
le paradigme « diviser pour régner »
• Le paradigme « diviser pour régner » comporte trois
étapes:
• Diviser : si la taille du problème est inférieure à un
certain seuil, alors le résoudre directement en allant
chercher parmi un ensemble de cas particuliers sinon
diviser le problème en sous-problèmes de même nature
et des tailles inférieures;
• Régner : les solutions sur les sous-problèmes, c-à-d
résoudre récursivement les sous-problèmes selon le
même principe.
• Combiner : les solutions des sous-problèmes en une
solution complète du problème initial.
H. Jamoussi Elkamel , FSM 37
Complexité et ASD

le paradigme « diviser pour régner »


Fonction resoudre ( I :probleme) :solution
Var S, S1, S2.. Sk: solution
I1, I2 …Ik : problème
n, i, k : entier
Debut
n ←taille(I)
si (n < seuil) alors S ← solutionDirecte(I)
sinon
diviser I en I1, I2 …Ik
pour i de 1 à k Faire
Si ← resoudre(Ii)
FinPour
S← combiner(S1, S2,… ,Sk)
Finsi
Retourner(S)
Fin.
Complexité et ASD H. Jamoussi Elkamel , FSM 38

19
le paradigme « diviser pour régner »
Problème : trier une séquence de n éléments d’un tableau T
Spécification du problème
Problème Tri
Entrée : - une séquence de n éléments d’un tableau T
- un entier n ( nombre des éléments à trier)
précondition: (n ≥ 0 )

Sortie : la séquence de n éléments du tableau T triée


Postcondition: la séquence est triée par ordre croissant

Taille du problème : n (le nombre des éléments à trier)


H. Jamoussi Elkamel , FSM 39
Complexité et ASD

le paradigme « diviser pour régner »


Tri par fusion
Principe
L’algorithme de tri par fusion est construit suivant le
paradigme « diviser pour régner » :
1. Il divise la séquence de n éléments à trier en deux sous-
séquences de taille n/2.
2. Il trie récursivement les deux sous-séquences.
3. Il fusionne les deux sous-séquences triées pour produire la
séquence complète triée.
La récursivité termine quand la sous-séquence à trier
est de longueur 1 (ou 0) car une telle séquence est
toujours triée. H. Jamoussi Elkamel , FSM 40
Complexité et ASD

20
le paradigme « diviser pour régner »
Procédure Tri-Fusion (var T: Tab; deb, Fin: entier)
Var milieu : entier
Debut
Si (deb < Fin)
alors
diviser milieu ← (deb + Fin) div 2
régner Tri-Fusion(T, deb, milieu)
Tri-Fusion(T, milieu+1, Fin)
combiner Fusionner(T, deb, milieu, Fin)
/* fusionner deux sous séquences triées*/
Finsi
Complexité et Fin. H. Jamoussi Elkamel , FSM 41
ASD

le paradigme « diviser pour régner »


Procédure Fusionner (var T: tab; deb, Tant que (i ≤milieu) faire
milieu, fin : entier )
R[k]  T[i]
Var i, j, k : entier
i i+1
R: tab
k  k+1
Debut
FinTantQue
ideb
j milieu + 1 Tant que (j ≤ Fin) faire
k 1 R[k]  T[j]
Tant que (i ≤milieu) et (j ≤fin) faire j i+1
Si (T[i] < T[j]) k  k+1
alors R[k]  T[i] FinTantQue
i i+1 pour k de 1 à (Fin-deb +1) faire
Sinon R[k]  T[j] T[k+deb-1]  R[k]
j j+1
FinSi FinPour
k  k+1
FinTantQue Fin

Complexité et ASD H. Jamoussi Elkamel , FSM 42

21
Fonctionnement d’une Méthode récursive
Fonction fact ( n : Entier) : Entier
Debut
Si (n = 0)
Alors Retourner (1)
Sinon Retourner ( n* fact(n-1))
FinSi
Fin
Algorithme appelfactorielle
Debut
Ecrire ( "Te s t f a c t o r i e l l e : " ) Test factorielle :
Ecrire ( "1 −> " , f a c t ( 1 ) ) 1→1
Ecrire ( "5 −> ", f a c t ( 5 ) ) 5 → 120
Ecrire ( " 9−> ", f a c t ( 9 ) ) 9 → 362880
Fin 43
Complexité et ASD H. Jamoussi Elkamel , FSM

Fonctionnement d’une Méthode récursive


• Pour comprendre l’exécution d’un algorithme récursif, on réécrit
l’algorithme en remplaçant l’appel de la fonction par le texte
algorithmique qui lui correspond:
fact(5)
5* fact(4) Sens d’appel
4* fact(3)
3* fact(2)
2* fact(1)
1* fact(0)
1
1* 1
2* 1
3* 2
4* 6
5* 24
120
Sens d’évaluation
Complexité et ASD H. Jamoussi Elkamel , FSM 44

22
Pile d’exécution

 Les appels à une méthode sont stockés dans un emplacement


mémoire appelé pile d’exécution ( call stack)
– La Pile fonctionne selon le principe LIFO (Last-In-First-Out) :
dernier entré premier sorti.
• En Empile l’environnement d’une méthode lors d’un appel
• En Dépile l’environnement si la méthode s’est terminée.

H. Jamoussi Elkamel , FSM 45


Complexité et ASD

Pile d’exécution

 L’Environnement d’une méthode (frame stack) est l’espace


mémoire pour stocker les informations d’une méthode.
Ces informations sont :
• Les Variables locales et les Paramètres de la méthode;
• Les Variables locales du compilateur;
• L’Adresse de retour dans la méthode appelante, ect..

Attention ! La pile a une taille fixée, une mauvaise utilisation de


la récursivité peut entraîner un débordement de pile (stack
overflow).

Complexité et ASD H. Jamoussi Elkamel , FSM 46

23
Pile d’exécution: Exemple
• Problème : suite de fibonnacci
Entrées : un entier positif n (n ≥ 0)
Sorties: un entier définit par

 0 si n0

Fn   1 si n 1
F  F si n 1
 n 1 n2

Taille du problème : n un entier

H. Jamoussi Elkamel , FSM 47


Complexité et ASD

Pile d’exécution: Exemple


fonction fibo (n: entier ): entier
Var f, f1, f2: entier Algorithme calculFibo
Var X: entier
Debut
1. Si (n=0) OU (n=1) Debut
2. alors f ← n x ←fibo(3)
3. Sinon Fin
4. f1 ←fibo(n-1)
5. f2 ←fibo(n-2)
6. f ← f1 + f2
Finsi
7. retourner (f)
Fin.

Complexité et ASD H. Jamoussi Elkamel , FSM 48

24
Pile d’exécution
Algorithme calculFibo
Var X: entier ?: valeur indéfinie
Debut fibo
x ←fibo(3) n:3 f1:?
Fin f2:? f:?
calculFibo @: ligne 1
fonction fibo (n: entier ): entier X=? calculFibo
Var f, f1, f2: entier X=?
Debut (1)
1. Si (n=0) OU (n=1) (2)
2. alors f ← n fibo
fibo n:2 f1:?
3. Sinon
n:3 f1:? f2:? f:?
4. f1 ←fibo(n-1) f2:? f:? @: ligne 1, 4
5. f2 ←fibo(n-2) @: ligne 4 fibo
6. f ← f1 + f2 calculFibo n:3 f1:?
Finsi X=? f2:? f:?
7. retourner (f) @: ligne 4
Fin. (3) calculFibo
H. Jamoussi Elkamel , FSM
X=? 49
Complexité et ASD
(4)

Pile d’exécution
Algorithme calculFibo
Var X: entier
Debut
x ←fibo(3)
Fin fibo fibo fibo
n:1 f1:? n:1 f1:? n:1 f1:?
fonction fibo (n: entier ): entier
f2:? f:? f2:? f:1 f2:? f:1
Var f, f1, f2: entier @: ligne 1 @: ligne 2 @: ligne 7
Debut fibo fibo fibo
1. Si (n=0) OU (n=1) n:2 f1:? n:2 f1:? n:2 f1:?
2. alors f ← n f2:? f:? f2:? f:? f2:? f:?
3. Sinon @: ligne 4 @: ligne 4 @: ligne 4
fibo fibo fibo
4. f1 ←fibo(n-1)
n:3 f1:? n:3 f1:? n:3 f1:?
5. f2 ←fibo(n-2) f2:? f:? f2:? f:? f2:? f:?
6. f ← f1 + f2 @: ligne 4 @: ligne 4 @: ligne 4
Finsi calculFibo calculFibo calculFibo
7. retourner (f) X=? X=? X=?
Fin.
(5) (6) (7) 50
Complexité et ASD H. Jamoussi Elkamel , FSM

25
Pile d’exécution
Algorithme calculFibo
Var X: entier
Debut
x ←fibo(3) fibo
Fin
n:0 f1:?
fonction fibo (n: entier ): entier f2:? f:?
Var f, f1, f2: entier @: ligne 1
Debut fibo fibo fibo
1. Si (n=0) OU (n=1) n:2 f1:1 n:2 f1:1 n:2 f1:1
f2:? f:? f2:? f:? f2:? f:?
2. alors f← n @: ligne 4 @: ligne 5 @: ligne 5
3. Sinon fibo fibo fibo
4. f1 ←fibo(n-1) n:3 f1:? n:3 f1:? n:3 f1:?
5. f2 ←fibo(n-2) f2:? f:? f2:? f:? f2:? f:?
6. f ← f1 + f2 @: ligne 4 @: ligne 4 @: ligne 4
Finsi calculFibo calculFibo calculFibo
7. retourner (f) X=? X=? X=?
Fin.
(8) (9) (10)
H. Jamoussi Elkamel , FSM 51
Complexité et ASD

Pile d’exécution
Algorithme calculFibo
Var X: entier
Debut
x ←fibo(3)
Fin fibo fibo
n:0 f1:? n:0 f1:?
fonction fibo (n: entier ): entier
f2:? f:0 f2:? f:0
Var f, f1, f2: entier @: ligne 2 @: ligne 7
Debut fibo fibo fibo
1. Si (n=0) OU (n=1) n:2 f1:1 n:2 f1:1 n:2 f1:1
2. alors f← n f2:? f:? f2:? f:? f2:0 f:1
@: ligne 5 @: ligne 5 @: ligne 6,7
3. Sinon
fibo fibo fibo
4. f1 ←fibo(n-1) n:3 f1:? n:3 f1:? n:3 f1:?
5. f2 ←fibo(n-2) f2:? f:? f2:? f:? f2:? f:?
6. f ← f1 + f2 @: ligne 4 @: ligne 4 @: ligne 4
Finsi calculFibo calculFibo calculFibo
7. retourner (f) X=? X=? X=?
Fin.
(11) (12) (13)
Complexité et ASD H. Jamoussi Elkamel , FSM 52

26
Pile d’exécution
Algorithme calculFibo
Var X: entier
Debut
x ←fibo(3)
Fin
fonction fibo (n: entier ): entier
Var f, f1, f2: entier
Debut fibo
1. Si (n=0) OU (n=1) n:1 f1:?
2. alors f← n f2:? f:?
@: ligne 1
3. Sinon
fibo fibo fibo
4. f1 ←fibo(n-1) n:3 f1:? n:3 f1:1 n:3 f1:1
5. f2 ←fibo(n-2) f2:? f:? f2:? f:? f2:? f:?
6. f ← f1 + f2 @: ligne 4 @: ligne 5 @: ligne 5
Finsi calculFibo calculFibo calculFibo
7. retourner (f) X=? X=? X=?
Fin.
(14) (15) (16)
H. Jamoussi Elkamel , FSM 53
Complexité et ASD

Pile d’exécution
Algorithme calculFibo
Var X: entier
Debut fibo
x ←fibo(3) n:1 f1:?
Fin
f2:? f:1
fonction fibo (n: entier ): entier @: ligne 2,7
Var f, f1, f2: entier fibo fibo
Debut n:3 f1:1 n:3 f1:1
f2:? f:? f2:1 f:2
1. Si (n=0) OU (n=1) @: ligne 6,7
@: ligne 5
2. alors f← n calculFibo calculFibo
calculFibo
3. Sinon X=? X=2
X=?
4. f1 ←fibo(n-1)
(17) (18) (19)
5. f2 ←fibo(n-2)
6. f ← f1 + f2
Pile vide:
Finsi arrêt de l’exécution
7. retourner (f)
Fin. (20)
Complexité et ASD H. Jamoussi Elkamel , FSM 54

27
Arbre d’exécution
• Un arbre d’exécution permet de modéliser les
appels d’une méthode récursive
• L’utilisation d’un arbre d’exécution permet:
• Une meilleur compréhension du déroulement de
l’exécution
• Une analyse du coût d’exécution d’une méthode
récursive
• L’arbre est formé par :
• Une racine
• Et un ensemble des nœuds liés par des relations
hiérarchiques (relation père et relation fils)
H. Jamoussi Elkamel , FSM 55
Complexité et ASD

Arbre d’exécution
• Un nœud de l’arbre modélise un appel à la méthode
• Un nœud de l’arbre d’exécution représente les paramètres
de l’appel récursif, la taille du problème, etc..
• Le premier appel de la méthode constitue la racine de
l’arbre;
• Un arc lie deux nœuds :
– un nœud fils représentant la méthode appelée
– un nœud père représentant la méthode appelante
• Un nœud terminal (une feuille) n’engendre aucun appel, il
représente un cas de base où la taille du problème est
inférieure au seuil critique.
• Le nombre des nœuds de l’arbre constitue le nombre
d’appels de la méthode récursive.
Complexité et ASD H. Jamoussi Elkamel , FSM 56

28
Arbre d’exécution
Exemple: fibo (3)

fibo(3)

fibo(2) fibo(1)

fibo(1) fibo(0)

H. Jamoussi Elkamel , FSM 57


Complexité et ASD

Arbre d’exécution
Exemple: fibo (3)
fibo(3)

fibo(2) fibo(1)

fibo(1) fibo(0)

• Le parcours de l’arbre en profondeur d’abord préfixé correspond


à l’ordre d’exécution d’une méthode récursive.
fibo(3), fibo(2), fibo(1), fibo(0), fibo(1)

Complexité et ASD H. Jamoussi Elkamel , FSM 58

29
Arbre d’exécution
Exemple: fibo (3)
fibo(3)

fibo(2) fibo(1)

fibo(1) fibo(0)

• Le calcul effectif du résultat d’une méthode récursive commence à


partir des feuilles (cas particuliers) en remontant à la racine.
• Le parcours de l’arbre en profondeur d’abord postfixé
correspond à l’ordre d’évaluation d’une méthode récursive.
fibo(1), fibo(0), fibo(2), fibo(1), fibo(3)
H. Jamoussi Elkamel , FSM 59
Complexité et ASD

Arbre d’exécution
• L’arbre fournit un outil formel pour l’analyse du coût
(temps d’exécution, nombre de tests) d’une méthode
récursive.
• Le calcul du coût total correspond à la somme des coûts
calculer à chaque niveau.
Exemple : coût = nombre
de « + » et «←» fibo(3) 4
coût total = 11
fibo(2) 4 fibo(1) 1

fibo(1) 1 fibo(0) 1

Complexité et ASD H. Jamoussi Elkamel , FSM 60

30
Type de récursivité
• Récursivité simple
Une méthode s’auto appel une seule fois.
Exemple : la fonction puissance x  xn.
 1 si n  0
xn   ( n 1)
 x x si n  1
• Récursivité multiple
Une définition récursive peut contenir plus d’un appel récursif.
Nous voulons calculer ici les combinaisons Cnp ((n≥0) et (p ≥0))
en se servant de la relation de
 1 si p  0 ou pn
Cnp   p p 1
Cn1  Cn 1 sinon
H. Jamoussi Elkamel , FSM 61
Complexité et ASD

Type de récursivité
• Récursivité mutuelle
Des définitions sont dites mutuellement récursives si elles
dépendent les unes des autres. Ça peut être le cas pour la définition
de la parité (n ≥0 )

vrai si n0  faux si n0


pair (n)   et impair ( n)  
 impair (n  1) sinon  pair ( n  1) sinon

• Récursivité imbriquée
La fonction d’Ackermann est définie pour (m≥0) et (n≥0) comme
suit : n 1 si m  0


A(m, n)   A(m  1,1) si m  0 et n  0
 A(m  1, A(m, n  1)) sinon

Complexité et ASD H. Jamoussi Elkamel , FSM 62

31
Récursivité terminale et récursivité non terminale

On dit qu’un appel récursif à A est terminal, si et seulement si cet appel


n’est jamais suivi par l’exécution d’une ou plusieurs instructions de A. .)

procedure A(p1, p2.. pn) procedure A(p1, p2.. pn)


Debut, Debut,
Si cond Si cond
alors I1 alors I1
Sinon I2 Sinon I2
A(f(p1, p2, .. pn)) A(f(p1, p2, .. pn))
Finsi Im
Fin. Finsi
Fin.

Récursivité simple terminale Récursivité simple non terminale


H. Jamoussi Elkamel , FSM 63
Complexité et ASD

Conclusion
• La récursivité est une technique de programmation
très utile qui permet de trouver des solutions
d’une grande élégance à un certain nombre de
problèmes.
• Attention, lorsqu’elle mal utilisée, cette subtilité
informatique peut créer un code totalement
inefficace.

Complexité et ASD H. Jamoussi Elkamel , FSM 64

32

Vous aimerez peut-être aussi