Introduction à la récursivité en informatique
Introduction à la récursivité en informatique
La récursivité
Cours 2 ASD
Concept de récursivité
Le concept de récursivité est un concept essentiel
en informatique
C’est à la fois :
Une manière d’aborder certains problèmes
Une méthode de programmation
M Abid 2
Décomposition d’un problème
L'analyse d'un problème passe souvent par la
décomposition de ce dernier en plusieurs sous-
problèmes.
Ces sous-problèmes peuvent également être
décomposés à leur tour en sous-problème jusqu'à
un niveau d'opérations élémentaires faciles à
réaliser
Exemple :
Le principe des fonctions en programmation
qui représentent la réalisation d'une sous
partie d'un problème.
M Abid 3
Décomposition récursive
Dans certains cas, le sous-problème est une
illustration du problème initial, mais pour un cas
“plus simple”.
Par conséquent, la solution du problème s’exprime
par rapport à elle-même
Définition:
On appelle récursive toute fonction ou procédure
qui s’appelle elle-même.
mathématiques : récurrence
informatique : récursivité
M Abid 4
Récursivité et récurrence
Le concept de récursivité se retrouve en
mathématiques sous le terme de récurrence
De nombreuses définitions mathématiques sont
récurrentes
Exemple:
M Abid 5
Exemple de la factorielle
Définition par récurrence de la fonction
factorielle
N! = N x (N-1) x …x 1
(i) 0! = 1
(ii) Pour N entier naturel (N > 0)
N! = N×(N - 1)!
M Abid
Exemple de la factorielle
Définition récurrente de la fonction factorielle:
N! = (1 x 2 x … x (N-1)) x N
N!=(N-1)! x N
Pour calculer N!, il suffit donc de savoir calculer
(N-1)!
Le sous-problème du calcul de (N-1)! est le même
que le problème initial mais pour un cas « plus
simple » puisque N-1 < N
M Abid 7
Exemple de la suite de Fibonacci
Définition par double récurrence de la suite de
Fibonacci
(i) U1 = U2 = 1
(ii) Pour n entier naturel (n > 2)
Un = Un-1 + Un-2
M Abid 8
Qu’est-ce qu’un algorithme récursif
Un algorithme est dit récursif s’il s'appelle lui-
même
de façon directe (récursivité directe ou
simple)
de façon indirecte (récursivité indirecte ou
croisée)
M Abid 9
Récursivité directe
L’algorithme comporte, dans son corps, au moins
un appel à lui-même.
...
void exemplerecursifsimple()
{
...
exemplerecursifsimple() ;
...
}
...
M Abid 10
Récursivité indirecte
L'appel récursif d'un sous-programme R se fait dans
le corps d'un ou de plusieurs sous-programmes
appelés par R
...
void R()
{
...
P() ;
...
}
void P()
{
...
R() ; /* appel récursif de R */
...
}
...
M Abid 11
Comment réaliser un algorithme récursif ?
De manière générale, un algorithme récursif doit
contenir:
Une condition terminale c’est-à-dire un cas de
base ou cas trivial pouvant être résolu sans
récursivité
M Abid 12
Appel récursif
Lors d’un appel récursif le sous-programme qui
traite le problème fait un appel à lui-même pour
traiter le cas le plus simple.
Ceci revient donc à faire un appel avec des
paramètres différents qui sont considérés comme
« plus simples ».
M Abid 13
Arrêt de la suite d’appels récursifs
Un appel récursif peut produire lui-même un autre
appel récursif etc. ce qui peut mener à une suite
infinie d’appels.
Il est donc très important d‘arrêter la suite
d’appel au moment où le sous-problème peut être
résolu directement
M Abid 14
Choix du cas trivial
Le choix de la condition d’arrêt est très
important.
Il faut s’assurer que la condition d’arrêt est
atteinte après un nombre fini d’appels.
Elle doit correspondre au cas le plus simple qu’on
veut traiter (cas trivial)
Pour la factorielle, le cas le plus simple est n=0
car 0 !=1 et il respecte la décomposition
1! = 0! x 1
M Abid 15
Cas de la fonction factorielle
La condition terminale : elle est donnée par le
cas de base 0!=1 (si on atteint 0 il suffit de
retourner 1)
Les pas récursifs avec progression vers le cas
de base à chaque appel : si fact est le nom de
notre fonction et N un entier naturel argument
de la fonction :
➢ fact(N) retourne (N x fact(N-1))
➢ fact(N-1) retourne (N-1 x fact(N-2))
➢ etc,
➢ fact(1) retourne (1 x fact(0))
M Abid 16
Exemple
Fonction fact équivalente à la définition
mathématique de la factorielle :
int fact(int n)
{
if (n == 0) return 1; /* Condition terminale */
return n*fact(n-1); /* Appel récursif */
}
M Abid 17
Exemple
En vérifiant le signe de n cela donne:
int fact(int n)
{
if (n<0) {
perror(« la factorielle ne s’applique qu’aux entiers naturels »);
exit(EXIT_FAILURE); /* sortie de la fonction avec un code erreur*/
}
if (n == 0) return 1; /* Condition terminale */
return n*fact(n-1); /* Appel récursif */
}
M Abid 18
Exécution d’un algorithme récursif
M Abid 19
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
M Abid 20
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0
5*fact(4)
M Abid 21
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4)
4*fact(3)
5*fact(4)
M Abid 22
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
4*fact(3)
5*fact(4)
M Abid 23
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0
4*fact(3)
5*fact(4)
M Abid 24
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0
3*fact(2)
4*fact(3)
5*fact(4)
M Abid 25
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0
3*fact(2)
4*fact(3)
5*fact(4)
M Abid 26
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
3*fact(2)
4*fact(3)
5*fact(4)
M Abid 27
Schéma détaillé d’exécution de l’appel fact(5)
fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
3*fact(2)
4*fact(3)
5*fact(4)
M Abid 28
Schéma détaillé d’exécution de l’appel fact(5)
fact(5) - schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
3*fact(2)
4*fact(3)
5*fact(4)
M Abid 29
Schéma détaillé d’exécution de l’appel fact(5)
fact(5) - schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
N0
3*fact(2)
4*fact(3)
5*fact(4)
M Abid 30
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
N0 fact(0)
3*fact(2)
4*fact(3)
5*fact(4)
M Abid 31
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
N0 fact(0)
N=0
3*fact(2)
4*fact(3)
5*fact(4)
M Abid 32
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
N0 fact(0)
N=0
(cond term)
3*fact(2)
4*fact(3)
5*fact(4)
M Abid 33
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
N0 fact(0)
N=0
(cond term)
1
3*fact(2)
4*fact(3)
5*fact(4)
M Abid 34
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
N0 fact(0)
N=0
(cond term)
1
3*fact(2)
4*fact(3)
5*fact(4)
remontée
M Abid 35
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
N0 fact(0)
N=0
1*fact(0) (cond term)
1
3*fact(2)
4*fact(3)
5*fact(4)
remontée
M Abid 36
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
N0 fact(0)
N=0
1*fact(0) (cond term)
1
3*fact(2) 1
4*fact(3)
5*fact(4)
remontée
M Abid 37
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
N0 fact(0)
N=0
1*fact(0) (cond term)
2*fact(1) 1
3*fact(2) 1
4*fact(3)
5*fact(4)
remontée
M Abid 38
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
N0 fact(0)
N=0
1*fact(0) (cond term)
2*fact(1) 1
3*fact(2) 1
4*fact(3)
2
5*fact(4)
remontée
M Abid 39
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
N0 fact(0)
N=0
1*fact(0) (cond term)
2*fact(1) 1
3*fact(2) 1
4*fact(3)
2
5*fact(4)
remontée
M Abid 40
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
N0 fact(0)
N=0
1*fact(0) (cond term)
2*fact(1) 1
3*fact(2) 1
4*fact(3)
2
5*fact(4)
6
remontée
M Abid 41
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
N0 fact(0)
N=0
1*fact(0) (cond term)
2*fact(1) 1
3*fact(2) 1
4*fact(3)
2
5*fact(4)
6
remontée
M Abid 42
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
N0 fact(0)
N=0
1*fact(0) (cond term)
2*fact(1) 1
3*fact(2) 1
4*fact(3)
2
5*fact(4)
6
remontée
24
M Abid 43
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
N0 fact(0)
N=0
1*fact(0) (cond term)
2*fact(1) 1
3*fact(2) 1
4*fact(3)
2
5*fact(4)
6
remontée
24
M Abid 44
fact(5) Schéma détaillé d’exécution de l’appel fact(5)
- schéma 1 -
N0 fact(4) Descente récursive
N0 fact(3)
N0 fact(2)
N0
fact(1)
N0 fact(0)
N=0
1*fact(0) (cond term)
2*fact(1) 1
3*fact(2) 1
4*fact(3)
2
5*fact(4)
6
remontée
24
120
M Abid 45
Notion de pile d’exécution
La pile d'exécution d'un programme en cours est
un emplacement mémoire destiné à mémoriser les
paramètres, les variables locales ainsi que les
adresses de retour des fonctions en cours
d'exécution
La pile d'exécution fonctionne selon le principe
LIFO (Last In First Out): dernier entré premier
sorti
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).
M Abid 46
Pile d’exécution et récursivité
De façon générale, à chaque appel de fonction, le
système empile l’environnement de la fonction au
niveau de la pile d’exécution. La grande
différence entre une fonction effectuant un
traitement itérativement et une fonction
effectuant le même traitement récursivement est
que :
La fonction itérative est appelée une seule fois :
un seul environnement est empilé
La fonction récursive est appelée 𝑝 fois : 𝑝
environnements sont empilés.
M Abid 47
États de la pile à l’exécution de fact(4)
N=4
Appel fact
en
cours (4)
États de la pile à l’exécution de fact(4)
N=4
Appel fact
en
cours (4)
États de la pile à l’exécution de fact(4)
N=4
Appel fact
en
cours (4)
fact
États de la pile à l’exécution de fact(4)
N=4
Appel fact
en
cours (4)
fact ?
États de la pile à l’exécution de fact(4)
Niveau
de réc
0 N=4
Appel fact
en
cours (4)
fact ?
États de la pile à l’exécution de fact(4)
Niveau
de réc
N=3
0 N=4 N=4
1 N=3
0 N=4 N=4
1 N=3
0 N=4 N=4
N=2
1 N=3 N=3
2 N=2
1 N=3 N=3
2 N=2
1 N=3 N=3
2 N=2
1 N=3 N=3
2 N=2
1 N=3 N=3
3 N=1
2 N=2 N=2
N=0
3 N=1 N=1
4 N=0
3 N=1 N=1
4 N=0
3 N=1 N=1
4 N=0
3 N=1 N=1
N=0
N=0
N=0
N=0
N=0
N=0
N=0
N=0
N=0
N=0
Appel fact fact fact fact fact fact fact fact fact
en
cours (4) (3) (2) (1) (0) (1) (2) (3) (4)
fact ? ? ? ? 1 1 2 6 6
États de la pile à l’exécution de fact(4)
Niveau
de réc
N=0
Appel fact fact fact fact fact fact fact fact fact
en
cours (4) (3) (2) (1) (0) (1) (2) (3) (4)
fact ? ? ? ? 1 1 2 6 6
États de la pile à l’exécution de fact(4)
Niveau
de réc
N=0
Appel fact fact fact fact fact fact fact fact fact
en
cours (4) (3) (2) (1) (0) (1) (2) (3) (4)
fact ? ? ? ? 1 1 2 6 24
A retenir
Le calcul effectif d’un algorithme récursif
démarre à partir du moment où on atteint le point
d’appui.
Le fonctionnement des appels récursifs engendre des
changements de contexte réalisés comme suit :
lors de la descente : le contexte est modifié à chaque
appel afin de progresser vers le point d’appui.
lors de la remontée : tout argument modifié à la descente
retrouve sa valeur initiale (valeur qu’il avait dans le
contexte d’appel).
M Abid 78
Récursivité terminale et non terminale
Pour déterminer si un algorithme récursif est
terminal, il faut regarder comment il génère les
valeurs de retour.
Si ce sont des constantes ou des valeurs
directement issues d'un appel récursif, sans
aucune autre modification, alors l'algorithme est
dit terminal.
Dans le cas contraire, il sera dit non-terminal.
Cette notion est importante si l'on veut
déterminer une version itérative de l'algorithme
concerné.
M Abid 79
Exemple de récursivité non terminale
Dans les exemples précédents, factorielle est non
terminale :
Bien que le cas d'arrêt renvoie une constante, celui de
l'appel récursif modifie la valeur renvoyée en la
multipliant par n avant de lui-même renvoyer une valeur
M Abid 80
Schéma détaillé d’exécution de l’appel fact(5)
Niveau de
récursivité
Schéma détaillé d’exécution de l’appel fact(5)
Niveau de Appel
récursivité exécuté
Schéma détaillé d’exécution de l’appel fact(5)
0 fact( 5 )
Schéma détaillé d’exécution de l’appel fact(5)
0 fact( 5 ) 5 * fact( 4 )
Schéma détaillé d’exécution de l’appel fact(5)
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
Schéma détaillé d’exécution de l’appel fact(5)
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 )
Schéma détaillé d’exécution de l’appel fact(5)
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
Schéma détaillé d’exécution de l’appel fact(5)
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
2 fact( 3 )
Schéma détaillé d’exécution de l’appel fact(5)
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
2 fact( 3 ) 3 * fact( 2 )
Schéma détaillé d’exécution de l’appel fact(5)
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
2 fact( 3 ) 3 * fact( 2 )
3 fact( 2 )
Schéma détaillé d’exécution de l’appel fact(5)
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
2 fact( 3 ) 3 * fact( 2 )
3 fact( 2 ) 2 * fact( 1 )
Schéma détaillé d’exécution de l’appel fact(5)
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
2 fact( 3 ) 3 * fact( 2 )
3 fact( 2 ) 2 * fact( 1 )
4 fact( 1 )
Schéma détaillé d’exécution de l’appel fact(5)
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
2 fact( 3 ) 3 * fact( 2 )
3 fact( 2 ) 2 * fact( 1 )
4 fact( 1 ) 1 * fact( 0 )
Schéma détaillé d’exécution de l’appel fact(5)
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
2 fact( 3 ) 3 * fact( 2 )
3 fact( 2 ) 2 * fact( 1 )
4 fact( 1 ) 1 * fact( 0 )
5 fact( 0 )
Schéma détaillé d’exécution de l’appel fact(5)
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
2 fact( 3 ) 3 * fact( 2 )
3 fact( 2 ) 2 * fact( 1 )
4 fact( 1 ) 1 * fact( 0 )
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
2 fact( 3 ) 3 * fact( 2 )
3 fact( 2 ) 2 * fact( 1 )
4 fact( 1 ) 1 * fact( 0 )
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
2 fact( 3 ) 3 * fact( 2 )
3 fact( 2 ) 2 * fact( 1 )
4 fact( 1 ) 1 * fact( 0 )
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
remontée
2 fact( 3 ) 3 * fact( 2 )
3 fact( 2 ) 2 * fact( 1 )
4 fact( 1 ) 1 * fact( 0 )
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
remontée
2 fact( 3 ) 3 * fact( 2 )
3 fact( 2 ) 2 * fact( 1 )
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
remontée
2 fact( 3 ) 3 * fact( 2 )
3 fact( 2 ) 2 * fact( 1 )
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
remontée
2 fact( 3 ) 3 * fact( 2 )
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
remontée
2 fact( 3 ) 3 * fact( 2 )
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
remontée
2 fact( 3 ) 3 * fact( 2 ) 3*2=6
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 )
remontée
2 fact( 3 ) 3 * fact( 2 ) 3*2=6
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 ) 4 * 6 = 24
remontée
2 fact( 3 ) 3 * fact( 2 ) 3*2=6
0 fact( 5 ) 5 * fact( 4 )
Descente récursive
1 fact( 4 ) 4 * fact( 3 ) 4 * 6 = 24
remontée
2 fact( 3 ) 3 * fact( 2 ) 3*2=6
Descente récursive
1 fact( 4 ) 4 * fact( 3 ) 4 * 6 = 24
remontée
2 fact( 3 ) 3 * fact( 2 ) 3*2=6
M Abid 110
Exemple de récursivité terminal:
la fonction PGCD
A et B étant deux entiers positifs, on a les
propriétés arithmétiques suivantes :
M Abid 111
Fonction PGCD en C
M Abid 112
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5)
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5)
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5)
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5)
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5)
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5)
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5)
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5)
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5)
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5)
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5)
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5)
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5)
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5)
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5)
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5)
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5) point d'appui
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5) point d'appui 5
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
remontée
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5)
7 PGCD(5,5) point d'appui 5
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15)
1 PGCD(65,15) PGCD(50,15)
Descente récursive
2 PGCD(50,15) PGCD(35,15)
remontée
3 PGCD(35,15) PGCD(20,15)
4 PGCD(20,15) PGCD(5,15)
5 PGCD(5,15) PGCD(5,10)
6 PGCD(5,10) PGCD(5,5) 5
7 PGCD(5,5) point d'appui 5
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15) 5
1 PGCD(65,15) PGCD(50,15) 5
Descente récursive
2 PGCD(50,15) PGCD(35,15) 5
remontée
3 PGCD(35,15) PGCD(20,15) 5
4 PGCD(20,15) PGCD(5,15) 5
5 PGCD(5,15) PGCD(5,10) 5
6 PGCD(5,10) PGCD(5,5) 5
7 PGCD(5,5) point d'appui 5
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15) 5
1 PGCD(65,15) PGCD(50,15) 5
Descente récursive
2 PGCD(50,15) PGCD(35,15) 5
remontée
3 PGCD(35,15) PGCD(20,15) 5
4 PGCD(20,15) PGCD(5,15) 5
5 PGCD(5,15) PGCD(5,10) 5
6 PGCD(5,10) PGCD(5,5) 5
7 PGCD(5,5) point d'appui 5
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15) 5
1 PGCD(65,15) PGCD(50,15) 5
Descente récursive
2 PGCD(50,15) PGCD(35,15) 5
remontée
3 PGCD(35,15) PGCD(20,15) 5
4 PGCD(20,15) PGCD(5,15) 5
5 PGCD(5,15) PGCD(5,10) 5
6 PGCD(5,10) PGCD(5,5) 5
7 PGCD(5,5) point d'appui 5
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15) 5
1 PGCD(65,15) PGCD(50,15) 5
Descente récursive
2 PGCD(50,15) PGCD(35,15) 5
remontée
3 PGCD(35,15) PGCD(20,15) 5
4 PGCD(20,15) PGCD(5,15) 5
5 PGCD(5,15) PGCD(5,10) 5
6 PGCD(5,10) PGCD(5,5) 5
7 PGCD(5,5) point d'appui 5
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15) 5
1 PGCD(65,15) PGCD(50,15) 5
Descente récursive
2 PGCD(50,15) PGCD(35,15) 5
remontée
3 PGCD(35,15) PGCD(20,15) 5
4 PGCD(20,15) PGCD(5,15) 5
5 PGCD(5,15) PGCD(5,10) 5
6 PGCD(5,10) PGCD(5,5) 5
7 PGCD(5,5) point d'appui 5
exécution de la fonction PGCD(80,15)
Niveau de fonction fonction valeur
récursivité exécutée appelée retournée
0 PGCD(80,15) PGCD(65,15) 5
1 PGCD(65,15) PGCD(50,15) 5
Descente récursive
2 PGCD(50,15) PGCD(35,15) 5
remontée
3 PGCD(35,15) PGCD(20,15) 5
4 PGCD(20,15) PGCD(5,15) 5
5 PGCD(5,15) PGCD(5,10) 5
6 PGCD(5,10) PGCD(5,5) 5
7 PGCD(5,5) point d'appui 5
Le concept de « profondeur » de la
récursivité
On appelle profondeur de la récursivité, le nombre
d’appels récursifs emboîtés (C’est en fait, le niveau de
récursivité maximal).
M Abid
Algo itératif versus algo récursif
L’approche récursive occupe plus de place en mémoire.
Ce point a son importance sur des équipements disposant de
peu de mémoire ou si on traite une grande quantité de
données, et/ou si le nombre d’appels récursifs est très
important : on risque alors un débordement de pile (stack
overflow).
L’approche itérative n’est pas toujours la meilleure
solution.
la difficulté à écrire le programme et la lisibilité du code
source obtenu.
certains problèmes sont naturellement plus facile à
résoudre de façon récursive. Dans ces cas-là, un programme
récursif sera beaucoup plus compact, intelligible, et simple à
concevoir que le programme itératif équivalent.
M Abid 140
Conclusion
La récursivité permet une formulation courte,
claire et élégante de certains problèmes.
M Abid 141