Chapitre n 1 : Récursivité o

publicité
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Chapitre no 1 : Récursivité
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
La récursivité est un concept selon lequel dans la définition
d’un objet ou la réalisation d’une démarche, il est fait appel à
l’objet lui-même ou à la démarche elle-même.
Les cas suivants constituent des cas concrets de récursivité :
processus dépendant de paramètres et faisant appel à ce
même processus sur d’autres paramètres plus simples.
Par exemple : suites récurrentes ;
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
La récursivité est un concept selon lequel dans la définition
d’un objet ou la réalisation d’une démarche, il est fait appel à
l’objet lui-même ou à la démarche elle-même.
Les cas suivants constituent des cas concrets de récursivité :
processus dépendant de paramètres et faisant appel à ce
même processus sur d’autres paramètres plus simples.
Par exemple : suites récurrentes ;
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
image contenant en elle-même des images similaires.
Voir figures 1a et 1b ;
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
La récursivité est un concept selon lequel dans la définition
d’un objet ou la réalisation d’une démarche, il est fait appel à
l’objet lui-même ou à la démarche elle-même.
Les cas suivants constituent des cas concrets de récursivité :
processus dépendant de paramètres et faisant appel à ce
même processus sur d’autres paramètres plus simples.
Par exemple : suites récurrentes ;
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
image contenant en elle-même des images similaires.
Voir figures 1a et 1b ;
concept défini en invoquant le même concept ;
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
La récursivité est un concept selon lequel dans la définition
d’un objet ou la réalisation d’une démarche, il est fait appel à
l’objet lui-même ou à la démarche elle-même.
Les cas suivants constituent des cas concrets de récursivité :
processus dépendant de paramètres et faisant appel à ce
même processus sur d’autres paramètres plus simples.
Par exemple : suites récurrentes ;
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
image contenant en elle-même des images similaires.
Voir figures 1a et 1b ;
concept défini en invoquant le même concept ;
algorithme qui s’appelle lui-même.
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
La récursivité est un concept selon lequel dans la définition
d’un objet ou la réalisation d’une démarche, il est fait appel à
l’objet lui-même ou à la démarche elle-même.
Les cas suivants constituent des cas concrets de récursivité :
processus dépendant de paramètres et faisant appel à ce
même processus sur d’autres paramètres plus simples.
Par exemple : suites récurrentes ;
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
image contenant en elle-même des images similaires.
Voir figures 1a et 1b ;
concept défini en invoquant le même concept ;
algorithme qui s’appelle lui-même.
Mots-clefs associés :
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
La récursivité est un concept selon lequel dans la définition
d’un objet ou la réalisation d’une démarche, il est fait appel à
l’objet lui-même ou à la démarche elle-même.
Les cas suivants constituent des cas concrets de récursivité :
processus dépendant de paramètres et faisant appel à ce
même processus sur d’autres paramètres plus simples.
Par exemple : suites récurrentes ;
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
image contenant en elle-même des images similaires.
Voir figures 1a et 1b ;
concept défini en invoquant le même concept ;
algorithme qui s’appelle lui-même.
Mots-clefs associés : récurrence, autoréférence, mise en abyme.
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
(a) Vache
(b) Arbre récursif
Figure – Exemples de dessins récursifs
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Définition
Définition récursive d’un objet
Une définition récursive d’un objet a pour caractéristique d’y
voir figurer l’objet lui-même :
objet == (une définition qui utilise le mot objet)
Chapitre no 1 :
Récursivité
1
Fonctions mathématiques définies récursivement
1
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Multiplication de deux entiers (reformulation).
n × a = (n − 1) × a + a
Chapitre no 1 :
Récursivité
1
Fonctions mathématiques définies récursivement
1
Multiplication de deux entiers (reformulation).
n × a = (n − 1) × a + a
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
2
Puissance d’un nombre décimal au Collège (reformulation).
an = an−1 × a
Chapitre no 1 :
Récursivité
1
Fonctions mathématiques définies récursivement
1
Multiplication de deux entiers (reformulation).
n × a = (n − 1) × a + a
Introduction
Définitions
récursives
Définition
Exemples
2
Algorithme
récursif
Puissance d’un nombre décimal au Collège (reformulation).
an = an−1 × a
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
3
Factorielle en Terminale (reformulation).
n! = (n − 1)! × n
Chapitre no 1 :
Récursivité
1
Fonctions mathématiques définies récursivement
1
Multiplication de deux entiers (reformulation).
n × a = (n − 1) × a + a
Introduction
Définitions
récursives
Définition
2
Exemples
Algorithme
récursif
Puissance d’un nombre décimal au Collège (reformulation).
an = an−1 × a
Définition
En Python
Exemples
3
Récursivité
et pile
n! = (n − 1)! × n
Choix
d’exercices
Intérêt
Problèmes
soulevés
Factorielle en Terminale (reformulation).
2
Arbre généalogique : concaténation de l’individu et des
arbres généalogiques du père et de la mère
Chapitre no 1 :
Récursivité
1
Fonctions mathématiques définies récursivement
1
Multiplication de deux entiers (reformulation).
n × a = (n − 1) × a + a
Introduction
Définitions
récursives
Définition
2
Exemples
Algorithme
récursif
Puissance d’un nombre décimal au Collège (reformulation).
an = an−1 × a
Définition
En Python
Exemples
3
Récursivité
et pile
n! = (n − 1)! × n
Choix
d’exercices
Intérêt
Factorielle en Terminale (reformulation).
2
Problèmes
soulevés
3
Arbre généalogique : concaténation de l’individu et des
arbres généalogiques du père et de la mère
Palindrome : palindrome entouré de deux lettres identiques
Chapitre no 1 :
Récursivité
1
Fonctions mathématiques définies récursivement
1
Multiplication de deux entiers (reformulation).
n × a = (n − 1) × a + a
Introduction
Définitions
récursives
Définition
2
Exemples
Algorithme
récursif
Puissance d’un nombre décimal au Collège (reformulation).
an = an−1 × a
Définition
En Python
Exemples
3
Récursivité
et pile
n! = (n − 1)! × n
Choix
d’exercices
Intérêt
Factorielle en Terminale (reformulation).
2
Problèmes
soulevés
3
Arbre généalogique : concaténation de l’individu et des
arbres généalogiques du père et de la mère
Palindrome : palindrome entouré de deux lettres identiques
Question 1 Ces définitions sont-elles pertinentes ?
Chapitre no 1 :
Récursivité
Introduction
Algorithme récursif
Définition
Définitions
récursives
Un algorithme récursif se caractérise par :
Définition
Exemples
1
une base de récursivité correspondant à un ou plusieurs
cas particuliers à partir desquels la chaîne de récurrence
(on dira plutôt d’induction) s’enclenche
2
le traitement des autres éléments faisant appel à un ou
plusieurs appels récursifs
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Chapitre no 1 :
Récursivité
Introduction
Algorithme récursif
Définition
Définitions
récursives
Un algorithme récursif se caractérise par :
Définition
Exemples
1
une base de récursivité correspondant à un ou plusieurs
cas particuliers à partir desquels la chaîne de récurrence
(on dira plutôt d’induction) s’enclenche
2
le traitement des autres éléments faisant appel à un ou
plusieurs appels récursifs
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Le processus est semblable à la récurrence utilisée en
mathématiques qui comporte de même :
1
une phase d’ initialisation
2
la propriété dite d’hérédité
Chapitre no 1 :
Récursivité
Fonction récursive en Python
Cas particulier où le paramètre est un entier naturel
Introduction
Définitions
récursives
Ici le paramètre n prend pour valeur initiale 0 et l’appel récursif
porte sur l’argument n − 1 :
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
def maFonction ( n ) :
if n == 0 :
return le r é sultat pour n = 0
else :
return une formule o ù appara î t
maFonction (n -1)
Chapitre no 1 :
Récursivité
Fonction récursive en Python
Cas particulier où le paramètre est un entier naturel
Introduction
Définitions
récursives
Ici le paramètre n prend pour valeur initiale 0 et l’appel récursif
porte sur l’argument n − 1 :
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
def maFonction ( n ) :
if n == 0 :
return le r é sultat pour n = 0
else :
return une formule o ù appara î t
maFonction (n -1)
Ainsi, pour l’exemple de la fonction puissance, on définira :
def puissance (a , n ) :
if n == 0 :
return 1
else :
return a * puissance (a ,n -1)
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Fonction récursive en Python
Cas plus général
Le codage de manière générale d’une fonction récursive s’écrira
selon le canevas :
def maFonction ( x ) :
if x == ( base ) :
return ( r é sultat pour maFonction
appliqu é e à la base )
else :
...
return ( un ou plusieurs appels
r é cursifs à maFonction )
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Fonction récursive en Python
Cas plus général
Le codage de manière générale d’une fonction récursive s’écrira
selon le canevas :
def maFonction ( x ) :
if x == ( base ) :
return ( r é sultat pour maFonction
appliqu é e à la base )
else :
...
return ( un ou plusieurs appels
r é cursifs à maFonction )
Question 2
N’y-a-t-il pas une condition sur les arguments appelés ?
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Fonction récursive en Python
Exemple 1 : fonction factorielle
def factorielle ( n ) :
if n == 0 :
return 1
else :
return n * fact (n -1)
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Fonction récursive en Python
Exemple 2 : Suite de Fibonacci
def Fibo ( n ) :
if n == 0 or n == 1 :
return n
else :
return Fibo (n -1) + Fibo (n -2)
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Fonction récursive en Python
Exemple 3 : palindrome
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
def palindrome ( s ) :
if len ( s ) <= 1:
return True
else :
n = len ( s )
return ( s [0] == s [n -1]) and
( palindrome ( s [1: n -1]) )
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Fonction récursive en Python
Exemple 4 : décomposition en facteurs premiers
On suppose ici avoir défini préalablement une fonction ppdp qui
rend le plus petit diviseur premier de n. en facteurs premiers
def decompose ( n ) :
if n == 0:
# cas d ’ exception
return " pas de d é composition en
facteurs premiers pour 0 "
elif n == 1:
# cas de base
return []
else :
# appel r é cursif
p = ppdp ( n )
return [ p ]+ decompose ( n // p )
Chapitre no 1 :
Récursivité
Exécution d’une fonction récursive
Création et exécution d’une pile
1/6
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Pour comprendre le processus de calcul, reprenons la fonction
puissance et voyons ce qui se passe pour le calcul de 52 , lors de
l’appel puissance(5,2).
On travaille avec une pile.
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Au départ la pile est Vide.
Juste après l’appel puissance(5,2), une place est
réservée en mémoire à une adresse, notons-la A 2, pour
stocker puissance(5,2) : l’état de la pile est donc après
une action push
Adresse
A2
Valeur
?
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Exécution d’une fonction récursive
Création et exécution d’une pile
2/6
Dans l’exécution de puissance(5,2), on appelle
puissance(5,1) que l’on multiplie par 5 : une place est
cette fois réservée en mémoire en haut de pile (nouveau
push) à une adresse que nous noterons A 1 pour stocker
puissance(5,1) ; et on laisse en attente en A 2 le calcul
5 × Valeur 1 où la Valeur 1 est la valeur « pointée » en
adresse 1 ; l’état de la mémoire est à présent :
Adresse
A1
A2
Valeur
?
5 × Valeur 1
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Exécution d’une fonction récursive
Création et exécution d’une pile
3/6
Définition
Exemples
Algorithme
récursif
Définition
En Python
Dans l’exécution de puissance(5,1) : même démarche
qu’à l’étape précédente avec appel à puissance(5,0) et
un nouveau push :
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Adresse
A0
A1
A2
Valeur
?
5 × Valeur 0
5 × Valeur 1
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Exécution d’une fonction récursive
Création et exécution d’une pile
Définition
Exemples
Algorithme
récursif
Définition
Dans l’exécution de puissance(5,0), on rend
directement comme résultat 1 :
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Adresse
A0
A1
A2
Valeur
1
5 × Valeur 0
5 × Valeur 1
4/6
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Exécution d’une fonction récursive
Création et exécution d’une pile
5/6
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Dans la pile ainsi constituée, on a une valeur en haut de
pile : ceci a pour effet de supprimer (action pop) la tête de
pile et d’envoyer sa valeur comme argument à l’adresse 1 :
Adresse
A1
A2
Valeur
5
5 × Valeur 1
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Exécution d’une fonction récursive
Création et exécution d’une pile
6/6
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
puis par le même procédé (nouvelle action pop)
Adresse
A2
Valeur
25
La pile est de hauteur 1 et contient une valeur, nouvelle
action pop qui rend la pile Vide : la valeur finale est
renvoyée comme résultat : 25
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Choix d’exercices
Exercice 1
facile
Définition
Exemples
Algorithme
récursif
Définition
En Python
Pour la suite (un ) définie par :
u0 = 0
et
∀ n ∈ N, un+1 = (n + 1) − un
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
écrire le code Python correspondant puis proposer une
conjecture concernant la formule explicite de un .
Exercice de maths : la démontrer.
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
Choix d’exercices
Exercice 2
chaud
Pour la suite (vn ) définie par :
v0 = 0
et
∀ n ∈ N, vn+1 = (n + 1) − vvn
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
écrire le code Python correspondant.
Challenge 1 : trouver la formule explicite.
Procéder par extrapolation...
Intérêt
Problèmes
soulevés
Challenge 2 : démontrer cette formule.
Chapitre no 1 :
Récursivité
Choix d’exercices
Exercice 3 : un petit dernier pour la route...
cool
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
Jeu de briques :
Coder une fonction Python qui rend le nombre de façons
d’obtenir une ligne de briques de longueur n en n’utilisant
que des briques de longueur 2 ou 3 :
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
In [5]: briques (7)
Out [5]: 3
In [6]: briques (8)
Out [6]: 4
In [7]: briques (10)
Out [7]: 7
Chapitre no 1 :
Récursivité
Intérêt de la récursivité
Un comportement inhumain
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
De nombreux problèmes sont résolus par l’ordinateur en ayant
recours à des algorithmes récursifs. Nous aurons l’occasion de
revenir sur ce point et d’en voir toute la portée. Citons :
la résolution du problème des tours de Hanoï (T.P. no 2) ;
l’algorithme hautement efficace de tri par fusion d’une liste
(qui sera vu prochainement).
Ces deux exemples montreront combien le cerveau humain ne
peut (hélas ?) fonctionner comme un ordinateur. La démarche
effectuée dans les deux cas ne peut être une démarche
« humaine » : c’est bien l’ordinateur qui dans le cas des tours de
Hanoï fournit concrètement (pas à pas) la démarche à suivre.
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Problèmes soulevés
Terminaison des algorithmes récursifs
Exemple 1
Considérons la fonction Python définie par :
def u ( n ) :
if n == 0 :
return 1
else :
return n - u ( u (n -1) )
Choix
d’exercices
Intérêt
Problèmes
soulevés
Question 3 Que va-t-il se passer ? D’où vient exactement le
problème ?
Chapitre no 1 :
Récursivité
Problèmes soulevés
Terminaison des algorithmes récursifs
Exemple 2
Introduction
Définitions
récursives
Définition
Considérons l’exemple suivant tiré de la célèbre suite de
Syracuse (cf. T.P. no 1) :
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
def longueurDuVol ( c ) :
assert c >0 , " le param è tre doit ê tre un
naturel non nul "
if c == 1:
return 0
elif c % 2 == 0:
return 1+ longueurDuVol ( c // 2)
else :
return 1+ longueurDuVol (3* c +1)
Question 4 Quel problème pose cette fonction ?
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Problèmes soulevés
Terminaison des algorithmes récursifs
Théorème
Les deux exemples précédents nous fournissent une illustration
du théorème :
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Théorème
Soit une fonction récursive dont le paramètre est un entier
naturel.
Pour qu’elle termine, il suffit que les appels récursifs portent
sur des arguments strictement inférieurs à l’argument initial
Chapitre no 1 :
Récursivité
Introduction
Définitions
récursives
Définition
Exemples
Algorithme
récursif
Problèmes soulevés
Terminaison des algorithmes récursifs
Lorsque la fonction ne porte pas sur un paramètre naturel, il est
par analogie suffisant, pour que cette fonction termine, que :
1
l’ensemble des paramètres soit muni d’une relation d’ordre
notée 4 qui permet de pouvoir dire qu’un argument est
"avant" (4) un autre argument
2
les appels récursifs portent sur des arguments qui sont
"avant" (4) l’argument initial.
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
Induction
On parle alors d’induction (au lieu de récurrence).
Les démonstrations de terminaison se font par "induction",
processus similaire à la récurrence forte (cf. ci-dessous).
Chapitre no 1 :
Récursivité
Problèmes soulevés
Terminaison
Démonstrations
Introduction
Définitions
récursives
1
Définition
Exemples
Algorithme
récursif
Définition
En Python
Exemples
Récursivité
et pile
Choix
d’exercices
Intérêt
Problèmes
soulevés
2
Si le paramètre est dans N, la démonstration de
terminaison se fait par une récurrence simple, double ou
forte selon les cas. On pose :
P(n) : " la fonction termine pour la valeur n "
Sinon, la démonstration de terminaison se fait par
induction. On pose alors :
P(x ) : "la fonction termine pour la valeur x "
Base : on démontre la propriété P(init) où init est la
valeur minimale du paramètre
Induction : pour x fixé, on suppose la propriété P(y )
vraie pour tout y ≺ x , et on démontre qu’elle est alors
aussi vraie pour x .
Téléchargement