Chapitre 9:
La récursivité
Eléments de contenu
A. Introduction @ la récursivité..
1. Contexte d'utilisation de la récursivité..
2, Exemple illustratif...s0.cceevnnne .
3, Le déroulement de I'exécution de la fonction récursive.
B. Définitions, notations et exemples.....ccccsssisseerssaeissseersnereessee
1. Définition d'un sous-programme récursif.
2, Forme générale et notation d'un sous-programme récursif.
3, Autres exemples.
4, Mécanisme d’exécution d'un sous-programme récursif.
C. Correspondance entre un algorithme récursif et un algorithme itératif 109
1, Solution itérative versus solution récursive..... 109
2. Correspondance entre les 2 solutions.
Testez vos connaissancesLa récursivité
Objectif général Ala fin de ce chapitre vous devez
du chapitre + Comprendre les concepts
relatifs & la récursivité.
Appliquer cette technique pour
écrire des algorithmes récursifs
en paralléle avec les
algorithmes itératifs.
Objectifs Comprendre la récursivité et
spécifiques du ses différentes formes,
chapitre Transformer des — problemes
récursifs en des — sous-
programmes récu
Comprendre les mécanismes
d'exécution d'un sous-
programme récursif.
Transformer des_—_—sous-
programmes récursifs en
itératifs et vice-versa
Donner des solutions récursives
pour des problémes
Récursivité ; Récursivitéterminale ;
Récursivité croisée ; remontée
récursive ; descente récursive ; pile
=oA. Introduction a la récursivité
1. Contexte d'ut 1
ation de la récursi
La récursivité est un mécanisme de programmation qui est utilisé dans le méme objectif que
les structures de contrdles itératives. Il s'agit alors d'écrire des sous-programmes récursifs
qui font appels a eux méme a la place des boucles afin de résoudre des problémes qui
nécessitent une répétition. Cette technique semble étre plus élégante pour le programmeur
(mais pas nécessairement plus efficace pour le systéme) surtout dans le cas de problémes
qui ont une définition récursive ou qui sont associés a des structures de données récursives.
2. Exemple illustratif
Nous allons illustrer dans ce qui suit les principes de la récursivité a travers l'exemple de
calcul de la somme de N entiers.
Enoncé
Soit & écrire une fonction nommée Somme permettant le calcul de la somme de N entiers.
La fonction Somme peut étre définie comme suit :
Définition 1 : Somme (n) = n + (n-1) + (n-2) +... +2 +140
Définition 2 : Somme (n) = n + Somme (n-1)
eT
Somme (0) = 0
we Fxemple
Somme (4) = 4 + Somme(3)
= 4 +3 + Somme (2)
443+ 2+ Somme (1)
=443 +241 + somme (0)
=44342+140
= 10
Solution
Nous allons tout d'abord écrire une version itérative de la fonction Somme, c’est-a-dire en
utilisant une boucle.
Sachant qu'une fonction (respectivement une procédure) Récursive est une fonction
(respectivement une procédure) qui fait appel a elle-méme.
En se basant sur la 28me définition de la fonction Somme, nous donnons la version
récursive suivante qui permet de calculer la somme de N entiers.
oof1 Fowerzow
2 pracr
3 (=O) AL
4 RETOURKER
5 om
5
?
8
3. Le déroulement de I'exécution de la fonction récur:
Pour étre effectivement utilisable, une fonction récursive doit contenir une ou plusieurs
conditions d'arrét afin d'éviter le risque d'une récursion infinie. Cette condition est appelée
“point terminal” ou "point d'appui” ou “point d'arrét” ou "valeur de base”.
Un sous-programme récursif contient au moins un appel au méme sous-programme
récursif. Cet appel se fait en changeant les paramétres effectifs d'appel qui doivent se
rapprocher de valeurs de base.
’
; b | Sornme (4) a
7 4+ Somme (3 j
: ©
. 6 Somme (3) e
: a
+ Somme t
: e
7 3 Sornme (2) if
é 6
7 2+ Som .
: u
' 1 Somme(1} r
° 5
i ~ Somme (0 i
v
: 0
- Remarque
Lexécution d'une fonction récursive se déroule en 2 étapes
+ La descente récursive qui est une suite d'appels récursifs jusqu’a latteinte du point
diarrét.
+ La remontée récursive qui consiste & évaluer les résultats retournés par les appels
récursifs et les renvoyer aux niveaux supérieurs des fonctions appelantes.
"S888B. Définitions, notations et exemples
1. Définition d'un sous-programme récursif
f Définition
Un sous-programme est défini de maniére récursive si sa définition fait référence & lui-
méme d'une facon directe ou indirecte, I! doit répondre principalement & ces 2 propriétés :
+ Il doit exister certains arguments appelés que nous avons déjé appelé « points
darréts » ou « valeurs de base » pour lesquels le sous-programme s'arréte, sinon
elle risque de tourner indéfiniment.
+ Chaque fois que le sous-programme fait référence & lui-méme, il doit étre plus
proche de ses valeurs de base.
2, Forme générale et notation d'un sous-programme récursif
On distingue entre 2 types de récursivité : la récursivité simple et la récursivité croisée.
La récursivité simple
Tous les appels récursifs apparaissent dans le corps du sous-programme récursif. Une
procédure récursive simple suit ce modéle :
1 pRocepur: Prec (
)
2 veeur
3 BT. (
) ALORS
4
5 saxon
6 [ehutres instructions»
1
8
8
0 eiw
La récursivité croisée
Dans ce type de récursivité, les appels récursifs sont provoqués par l'exécution d'autres
procédures ou fonctions suivant ce modéle :
ructions>]
12 pRoceDuRE grec (1)
18 beeun
«ST (condition dtarrét>) ALORS
Sane e=Exemple
Soit les suites mathématiques U et V définies comme suit :
Un = 2* Viel +3 sin >=1
Vn = 3* Un-1 +2 sin>=
Uo =1
vo =2
Ecrire les fonctions récursives U et V qui permettent de calculer les termes de ces 2 suites.
Remarque
+ XetY sont la liste de paramétres de procédures Prec et Qrec.
+ F(X) et FCY) sont les fonctions qui permettent de transformer respectivement les
parameétres de Prec et Qrec.
Une autre distinction est faite entre la récursivité terminale et la récursivité non terminale :
+ La récursivité terminale : un sous-programme récursif terminal ne contient pas
d'autres instructions aprés l'appel récursif.
+ La récursivité non terminale : un sous-programme récursif non terminal contient
d'autres instructions aprés l'appel récursif.
3. Autres exemples
&
Exemple : Factorielle
Ecrire la fonction nommée Fact qui permet de calculer la factorielle d'un entier positif en
exploitant les définitions suivantes :
Definition 1; nt= 1*2* 3* ...n
Définition 2: n= n* (n-1)!
La version itérative de la fonction factorielle :
1) Foscrzow
2
3
4
5
6
7
6
9
0
7
11
t
"S88La version récursive de la fonction factorielle :
FONCTION Pact (DON Nz Entier) Bntie
1
2 av
3 sz ( =0) ALORS
4 RETOURNER
5 srKow
5
1
6
e Exemple_: PGCD
Soit & écrire la fonction PGCD qui permet de calculer le plus grand commun diviseur de 2
entiers strictement positifs en utilisant la méthode de soustraction suivante :
PGCD (X, ¥) = PGCD (X, Y-X) siX <
PGCD (X, ¥) = PGCD (X-Y, Y) siX > ¥
PGCD (X, Y) = X si X:
La version récursive de la fonction PGCD
ON 26CD (208 x, ¥ + ENtier
my
1 (ON PGCD (DON X, ¥ + Entier) + Eatle
2 pesur
3 ‘ANT QUE (X # Y) FAIRE
4 ST 0k < ¥) ALORS
5 ye eK
5 sIxow
7
8
6
0
7
FIN TANT QUE
RETOURNER (x)
fe Exemple_: Fibonacci
Soit & écrire la fonction nommeée FIB qui permet de calculer la suite de Fibonnacci définie
comme si
FIB (0) = 0
FIB (1)
FIB (N) = FIB (N-1) + FIB (N-2) SiN >=2
La version récursive de la fonction FIB
Hanne =1
2 peur
3ST (a0) ALORS
4 RETOURKER (0)
5 a8
6 sl w= 1)
7 ‘RETOURNER
8 sam
6 RETOURWER (P18 (N-2) + FIB (
0 FIN ST
i" aw St
m0 etK
La version itérative de la fonction FIB
1
2 VARIABLE
3 F, Preed, Preeind: Entier
4
5 ALORS
6
7
8
8
10
it 1
2
8
4
15
6
7 FIN
8 FIN st
9 a8 SE
2 ——_RBTOURNER «)
aoe
4. Mécanisme d'exécution d'un sous-programme récursif
Bien que la récursivité semble étre plus simple et plus élégante pour le programmeur dans
la résolution de certains problémes qui sont récursifs par nature ou dans le cas oli ces
problémes sont associées a des structures de données récursives, son exécution n'est pas si
simple et nécessite le recours une structure de données spécifique nommée pile.
La pile est une liste spécifique qui est gérée a travers le protocole LIFO (Last In First Out),
Clest-a-dire le dernier élément ajouté est le premier élément traité. L'exécution d'un sous-
programme récursif par le systéme suit les phases suivantes:
En rencontrant un appel récursif, le systeme réserve lespace pour le résultat et empile
(ajoute) dans la pile d'exécution les paramétres, les variables locales et I'adresse de retour.
Ala fin de l'appel récursif, le systme dépile (supprime) l'enregistrement, se branche &
adresse de retour et y place le résultat.
"S88C. Correspondance entre un algorithme récursif et un
algorithme itératif
1, Solution itérative versus solution récursive
Le choix entre une solution itérative ou récursive dépend de la nature du probléme &
résoudre. La récursivité est beaucoup plus facile et compacte dans le cas des problemes
récursifs ou les structures de données récursives (liste, arbre, graphe...). Ces avantages ne
doivent pas masquer les inconvénients de cette technique tels que le temps d'exécution,
lespace mémoire occupée et la difficulté d'estimer la profondeur maximale de la récursivité
(Cest 8 dire le nombre maximal d'appels récursifs afin d'atteindre le point d'arrét).
Malgré la divergence entre les 2 techniques de programmation, le passage d'un schéma
itératif un schéma récursif (la récursifcation) ou d'un schéma récursif @ un schéma
itératif (la dérécursification) est généralement possible.
2. Correspondance entre les 2 solutions
Nous présentons dans ce qui suit la correspondance entre le schéma itératif et le schéma
récursif dans le cas d'une récursivité terminale,
Soit P un sous-programme itératif et Prec un sous-programme récursif correspondant. X est
la liste de paramétres de la procédure, F(X) est la fonction qui permet de transformer les
parameétres lors d'un appel récursif, C(X) est la condition qui permet d'entrer dans la boucle
ou faire des appels récursifs et B(X) est le traitement dans le cas de point d'arrét,
Schéma récursif
1
2
3
4
5
5
7
6
8
0
Schéma itératif
1
2
3
4
5
6 TANT
1
6
6
0
ni