Récursivité
Notion de récurrence
Dans la vie de tous les jours nous accomplissons fréquemment des taches récurrentes : ce sont des activités
constituées d’étapes répétitives qui se succèdent selon une règle simple. Il suffit alors de connaitre le point de
départ de la tache, de savoir comment on passe d’une étape à la suivante pour réussir à parvenir à n’importe
quelle étape de la tache récurrente.
Ainsi en est-il de la marche : pour commencer il faut se tenir debout et faire un pas en avant en plaçant une
jambe devant l’autre ; quand on a déjà fait
pas on augmente la distance parcourue d’un pas en faisant un
nouveau pas vers l’avant en avançant la jambe qui est derrière.
On peut donner en mathématiques l’exemple d’une suite récurrente
où
est un entier naturel, définie
par la valeur de son terme initial
0
u
et la relation de récurrence qui donne (pour
) son
terme à
partir de son
(récurrence simple) : 1
2
n n
n
u u u
−−
= +
. Ces données suffisent à calculer n’importe quel
élément de cette suite.
En mathématiques, un « raisonnement par récurrence » permet de démontrer une propriété
pour tout
en démontrant d’une part la propriété
, et d’autre part que pour
la propriété
implique la propriété
.
Algorithme itératif ou algorithme récursif
On peut concevoir plusieurs algorithmes permettant de calculer le terme
de la suite ci-dessus.
• Une première méthode est l’algorithme itératif
, utilisant une boucle inconditionnelle (boucle for) : on
calcule les termes successifs en partant du terme initial et en appliquant la relation de récurrence successivement
jusqu’au
souhaité. Implémentation en python :
def u(n):
r=2 # Valeur initiale de la suite
for i in range(n): # S’exécute une fois si n=1
r=0.5*(r+3/r)
return r
Un avantage de cet algorithme est sa démarche naturelle : on part du terme initial pour arriver jusqu’au
.
Un autre avantage est qu’on n’utilise qu’une seule variable
pour stocker les valeurs successives des termes de
la suite.
Un inconvénient de cet algorithme est que son écriture masque la relation de récurrence, et n’est pas très
facile à lire. Au départ on affecte
avec le terme initial
; si
, c’est la valeur qui est retournée par la
fonction ; dans l’affectation suivante qui suppose
:
r=0.5*(r+3/r)
le
à droite représente
(
variant de
à
), tandis que le
à gauche représente
. A la dernière étape
et comme
, le
dernier terme calculé est bien
. Nous venons de prouver que cet algorithme se termine et retourne le résultat
attendu (
terminaison et correction de l’algorithme
).
• Une seconde méthode est l’algorithme récursif
. Une fonction
est dite récursive si son appel (appel
principal) peut provoquer un ou plusieurs appels de
elle-même (appels récursifs). Un langage est dit récursif s’il
autorise la programmation de fonctions récursives. C’est le cas de la plupart des langages de programmation
actuels, et en particulier de python. La fonction récursive est très proche de la définition de la propriété
récurrente : si
est nul on retourne la valeur du terme initial
, et si
on calcule (et on retourne)
avec
la relation de récurrence par un appel récursif à la fonction pour
. Implémentation en python :