Récursivité
SMI S3 - FSDM
2 de 2
Récursivité et Récurrence
Définition
Algorithme Fact
Entrée : un entier positif N
Sortie : factorielle de N
si N = 0 retourner 1
sinon retourner N x Fact(N-1)
4 de 4
Ça marche ! ! !
5 de 6
Comment ça marche ?
Appel à fact(4)
. 4*fact(3) = ?
. Appel à fact(3)
. . 3*fact(2) = ?
. . Appel à fact(2)
. . . 2*fact(1) = ?
. . . Appel à fact(1)
. . . . 1*fact(0) = ?
. . . . Appel à fact(0)
. . . . Retour de la valeur 1
. . . . 1*1
. . . Retour de la valeur 1
. . . 2*1
. . Retour de la valeur 2
. . 3*2
. Retour de la valeur 6
. 4*6
Retour de la valeur 24
6 de 7
Point terminal
Retenir
Comme dans le cas d’une boucle, il faut un cas d’arrêt où l’on ne
fait pas d’appel récursif.
procédure récursive(paramètres):
si TEST_D’ARRET:
instructions du point d’arrêt
sinon
instructions
récursive(paramètres changés); // appel récursif
instructions
8 de 11
La récursivité terminale
Définition
On dit qu’un fonction est récursive terminale, si tout appel récursif
est de la forme return f(...)
si n == 0 retourner a
sinon retourner Algo(n-1,n*a)
8 de 12
La récursivité terminale
Définition
On dit qu’un fonction est récursive terminale, si tout appel récursif
est de la forme return f(...)
si n == 0 retourner a
sinon retourner Algo(n-1,n*a)
9 de 13
Deux exemples. . .
Exemple 1 : litÉcritOrdo
fonction litÉcritOrdo(in nb : entier) : vide
Lit, puis écrit dans le même ordre, nb nombres entiers.
Algorithme de litÉcritOrdo
si nb ą 0 alors
valeur Ð lire
écrire valeur
litÉcritOrdopnb ´ 1q
fsi
11 de 14
Deux exemples. . .
Exemple 1 : litÉcritOrdo
fonction litÉcritOrdo(in nb : entier) : vide
Lit, puis écrit dans le même ordre, nb nombres entiers.
Algorithme de litÉcritOrdo
si nb ą 0 alors
valeur Ð lire
écrire valeur
litÉcritOrdopnb ´ 1q
fsi
Deux exemples. . .
Exemple 2 : litÉcritInv
fonction litÉcritInv(in nb : entier) : vide
Lit, puis écrit dans l’ordre inverse, nb nombres entiers.
Algorithme de litÉcritInv
si nb ą 0 alors
valeur Ð lire
litÉcritInvpnb ´ 1q
écrire valeur
fsi
13 de 14
Deux exemples. . .
Exemple 2 : litÉcritInv
fonction litÉcritInv(in nb : entier) : vide
Lit, puis écrit dans l’ordre inverse, nb nombres entiers.
Algorithme de litÉcritInv
si nb ą 0 alors
valeur Ð lire
litÉcritInvpnb ´ 1q
écrire valeur
fsi
Autre exemple
Calcul du coefficient binomial Cnk :
$
&0
’ si k ą n
Cnk “ 1 si k “ 0 ou k “ n
´1
’
Cnk´ k
1 ` Cn ´ 1 sinon
%
Calcul de Cnk
fonction cnk(in n : entier, in k : entier) : ret entier
Algorithme de cnk
si k ą n alors
retourner 0
sinon si k “ 0 _ k “ n alors
retourner 1
sinon
retourner cnkpn ´ 1, k ´ 1q ` cnkpn ´ 1, k q
fsi
Exemple 3: Tours de Hanoi
Il s'agit d'un casse-tête célèbre qui consiste à trouver une
stratégie pour déplacer une pile de n disques d'une tour A à
une tour C à l'aide d'une tour auxiliaire B. Tous les disques
ont un diamètre différent. Les règles du jeu sont les
suivantes :
On ne peut déplacer qu'un seul disque à la fois d'une tour à
une autre;
On ne peut empiler un disque sur un disque de diamètre
inférieur.
L’algorithme récursif : Tours de Hanoi
FONCTION DEPLACER(n: entier,TO:entier,TD:entier): vide
DEBUT
SI (n = 1) ALORS
AFFICHER(TO,"→",TD);
SINON
DEPLACER(1, TO, TD);
DEPLACER(n - 1, 6 - (TO + TD), TD);
FSI
FIN.