Un autre chapitre court sur une notion-clef en algorithmique: la récursivité. Une fonction ou une procédure est dite récursive si dans son code elle fait appel à elle-même. Ce type de sous-programmes permet de réaliser des algorithmes complexes sans utiliser de boucles. La difficulté principale de ce genre d’algorithme est de s’assurer de la terminaison du programme.
Les algorithmes itératifs sont utilisés dans différents contextes:
L’exemple le plus pertinent pour illustrer les algorithmes récursifs et le calcul de n!
. En effet, on se base sur la formulation récursive de la suite où n! = n \times (n-1)!
et 1! = 0! = 1
. L’algorithme est le suivant:
Lorsque l’on écrit un algorithme récursif, il faut faire attention à la définition de la fonction (notamment s’assurer qu’elle s’arrête) et à son utilisation (notamment son appel et son type de retour).
Un autre exemple classique est la suite de Fibonacci définie de la manière suivante u_n = u_{(n-1)} + u_{(n-2)}
et u_0 = 0$, $u_1 = 1
.
Enfin un autre exemple classique:
Que fait cet algorithme ?
De fait, un algorithme récursif terminal ne nécessite pas de stocker la valeur obtenue par récursivité. Par exemple:
fact(n)
n’est pas terminal car le résultat de fact(n-1)
est stocké pour être multiplié par n
somme(n,r)
est récursif terminal puisqu’il n’y a pas de stockage de résultat i.e. somme(n,r) = somme(n-1, r+1) = somme(n-2, r+2) = ...
La transformation de récursif en itératif est dépendante de l’algorithme mais implique en général une boucle. Par exemple, le calcul de factorielle, version récursive,
devient en itératif