1. [LA RECURSIVITE EN PYTHON] ESPRIMS’
Mariem ZAOUALI | Chapitre 4 : La récursivité en Python 1
Chapitre 4 : La récursivité en Python
• Définition de la récursivité
• Comparaison entre l’itératif et le récursif
1. Définition de la récursivité et comparaison entre l’itératif et le
récursif
a. La récursivité
Pour minimiser la complexité de compréhension d’un problème, on opte pour sa
décomposition en des sous-problèmes moins complexes. Ce qui fait que la résolution
du grand problème revient à résoudre ceux des sous-problèmes (L’algorithme va
s’appeler lui-même pour résoudre les sous-problèmes) La notion proche en
mathématique à cette démarche est le raisonnement par récurrence.
Une fonction est dite récursive si elle s’appelle elle-même. Il faut prévoir toujours une
condition d’arrêt pour stopper les appels récursifs sinon on obtient un traitement
similaire à une boucle infinie.
Exemple :
Un appel récursif induit lui-même à d’autres appels récursifs, ce qui peut mener à un
nombre infini d’appels. Il faut arrêter la suite des appels ! Dans notre cas, on sait que
0!=1, une fois n atteint la valeur 0, le processus d’appel doit s’arrêter:
Python utilise une pile d’exécution pour enregistrer les appels et leurs contextes
(paramètres utilisés, résultats rendus, variables locales déclarées par chacun des
appels…). Mais la taille de la pille n’est illimitée! Elle peut déborder et donc elle
déclenche une exception.
La pile d’exécution de l’appel de fact avec n=3 a l’allure suivante:
2. [LA RECURSIVITE EN PYTHON] ESPRIMS’
Mariem ZAOUALI | Chapitre 4 : La récursivité en Python 2
D’une manière générale, pour obtenir une solution récursive à un problème
On paramètre le problème
On décompose le problème
On détermine la condition d’arrêt qui arrête les énoncés récursifs
Dans le cas de la factorielle, la relation entre le cas simple et le cas général est la
réduction des données n!=n*(n-1)! Mais ce n’est pas toujours qu’on attend une
valeur!
Parfois la fonction ne retourne aucune valeur mais effectue des actions récursives
comme par exemple le cas d’affichage d’une liste ou son inversion
Exemple 1 :
Exécution
Exemple 2 :
3. [LA RECURSIVITE EN PYTHON] ESPRIMS’
Mariem ZAOUALI | Chapitre 4 : La récursivité en Python 3
Exécution
b. Itératif vs récursif
Toute solution récursive peut avoir une solution itérative équivalente. La version
récursive augmente la complexité algorithmique par rapport à la version itérative
d’où une augmentation du temps du calcul. L’avantage de la récursivité réside au
niveau de l’abstraction. Il suffit de décrire la solution au problème à partir d’un cas
simple. Ce style de programmation est appelé déclaratif. On utilise la récursivité si:
Le raisonnement du problème est lui-même récursif.
La structure de données utilisée est récursive(une liste peut être vue
comme un élément suivi d’une autre liste).
c. Exemple de raisonnement récursif : les tours de Hanoï
Il s’agit d’un jeu où on va déplacer les disques d’un point de départ vers une
destination. Nous disposons donc de :
• 3 bâtons : A,B,C
• 3 disques de différentes tailles déposés les uns sur les autres, du plus grand au
plus petit en terme de diamètre
• 2 Règles à suivre :
o Déplacer un disque à la fois d’un bâton à un autre
o Ne jamais mettre un disque sur un plus petit disque
4. [LA RECURSIVITE EN PYTHON] ESPRIMS’
Mariem ZAOUALI | Chapitre 4 : La récursivité en Python 4
Exemple :
1. Mettre tous les disques sauf le plus grand sur C
2. Déplacer le plus grand disque de A vers B
3. Mettre tous les disques de C sur B
Les points 1 et 2 de la solution esquissée sont des problèmes de Hanoï avec un
disque de moins. Si on sait résoudre un problème avec n-1 disques, alors on sait le
résoudre avec n disques. Or, on sait résoudre le problème avec 1 disque. Le
problème est résolu pour tout nombre n≥1 de disques. La solution est récursive.
Raisonnement :
Cas de n=2
On déplace le petit disque de A vers C
On déplace le grand disque de A vers B
On déplace le petit disque de C vers B
Donc, on a utilisé 3 déplacements pour résoudre le problème
Cas général
Déplacer les n-1 premier disques (D1,D2,..Dn-1) du pilier gauche vers le
pilier intermédiaire
Déplacer le grand disque Dn du pilier gauche au pilier au centre
Et déplacer les n-1 disques du pilier intermédiaire vers le pilier au centre
5. [LA RECURSIVITE EN PYTHON] ESPRIMS’
Mariem ZAOUALI | Chapitre 4 : La récursivité en Python 5
En python, la solution est :
d. Type de récursivité
Simple: La fonction récursive s’appelle elle-même une seule fois (calcul de la
factorielle)
Multiple: La fonction s’appelle elle-même plusieurs fois dans un même appel
récursif (calcul d’une combinaison)
Croisée: Deux fonctions récursive chacune appelant l’autre (exemple nombre
pair et nombre impair)
Imbriquée: l’appel est une imbrication d’appel (suite Ackermann)
6. [LA RECURSIVITE EN PYTHON] ESPRIMS’
Mariem ZAOUALI | Chapitre 4 : La récursivité en Python 6
Terminale VS non terminale: quand l’appel récursif nécessite des instructions
de calcul autre que l’appel de la fonction elle-même, on parle de récursivité
non terminale
2. Applications
1. Donner la version récursive de la suite de Fibbonacci
2. Donner la version itérative et récursive de la fonction qui permet, pour deux
entier positifs a et b, de retourner « vrai » si a divise b et faux sinon.
Indication : test avec a=2 et b=8. On retranche de b la valeur a tant que a<b.
Si on trouve a=b c’est bien 2 est diviseur de 8!
3. Ecrire une fonction récursive permettant de convertir un nombre N donné
(base 10) en une base b (2<=b<=10)