Académique Documents
Professionnel Documents
Culture Documents
données
Semestre 2
Elaboré par Mme Elkamel Hager
Jamoussi.hager@gmail.com
Plan du cours
1
Chapitre 2
La récursivité et le paradigme
« diviser pour régner »
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
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.
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).
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
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)
4
Exemple d’Objets récursifs
• Une Liste est
• Soit une liste vide
• Soit un élément en entête suivie par une Liste
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
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)…. 21
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
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é).
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
8
Récursivité terminale et récursivité non terminale
9
Exemple d’une méthode récursive
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
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
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
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
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
n 1
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
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
• 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…
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 )
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
Tour de Hanoï
• Cas de base
Si n=0 aucun déplacement
Si n=1 déplacer le disque de A vers B
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
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
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 )
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
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
22
Pile d’exécution
Pile d’exécution
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 n0
Fn 1 si n 1
F F si n 1
n 1 n2
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)
Arbre d’exécution
Exemple: fibo (3)
fibo(3)
fibo(2) fibo(1)
fibo(1) fibo(0)
29
Arbre d’exécution
Exemple: fibo (3)
fibo(3)
fibo(2) fibo(1)
fibo(1) fibo(0)
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
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 pn
Cnp p p 1
Cn1 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 )
• 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
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.
32