[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:
[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 :
[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
[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
[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)
[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)

Chap4 Récursivité en python

  • 1.
    [LA RECURSIVITE ENPYTHON] 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 ENPYTHON] 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 ENPYTHON] 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 ENPYTHON] 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 ENPYTHON] 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 ENPYTHON] 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)