Structures de donn´ ees et algorithmes fondamentaux
R´ecursivit´e
Anthony Labarre
Universit´e Gustave Eiffel
4 novembre 2020
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Notion de r´ ecursivit´ e
La r´ ecursivit´ e est la propri´ et´ e que poss` ede un objet ou un concept de s’exprimer “en fonction de lui-mˆ eme”.
Exemple 1 (quelques objects r´ ecursifs)
niveau 0
niveau 1
niveau 2
niveau 3
I
matrioshka = poup´ ee contenant une matrioshka ;
Ifractale = ligne polygonale “fractalis´ ee” ;
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Notion de r´ ecursivit´ e
La r´ ecursivit´ e est la propri´ et´ e que poss` ede un objet ou un concept de s’exprimer “en fonction de lui-mˆ eme”.
Exemple 1 (quelques objects r´ ecursifs)
niveau 0
niveau 1
niveau 2
niveau 3
I
matrioshka = poup´ ee contenant une matrioshka ;
I
fractale = ligne polygonale “fractalis´ ee” ;
3
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Notion de r´ ecursivit´ e
La r´ ecursivit´ e est la propri´ et´ e que poss` ede un objet ou un concept de s’exprimer “en fonction de lui-mˆ eme”.
Exemple 1 (quelques objects r´ ecursifs)
niveau 0
niveau 1
niveau 2
niveau 3
I
matrioshka = poup´ ee contenant une matrioshka ;
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Notion de r´ ecursivit´ e en algorithmique
Un algorithme est r´ ecursif s’il s’appelle lui-mˆ eme.
Exemple 2 ((mauvaise) fonction r´ ecursive)
def f(x):a = f(2 * x - 17) return (5 * a + 18)
L’approche r´ ecursive est utile pour :
I´ ecrire des algorithmes ;
I
d´ efinir des structures de donn´ ees (on en reparlera pour la r´ ecursivit´ e sur les it´ erables) ;
On parlera d’algorithme it´ eratif par opposition aux algorithmes r´ ecursifs.
5
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple informel : recherche de fichiers
Cherchons l’emplacement d’un fichier dont on connaˆıt le nom.
L’algorithme de recherche s’exprime tr` es simplement de mani` ere r´ ecursive :
1.
si le fichier ` a chercher est dans le r´ epertoire actuel, on renvoie son chemin ;
2.sinon, on effectue la
mˆ eme recherche dans les sous-r´ epertoires.
/ (24 sous-r´epertoires) /bin ( 1 sous-r´epertoires) /boot ( 3 sous-r´epertoires) /dev (20 sous-r´epertoires) /etc (83 sous-r´epertoires) /home ( 4 sous-r´epertoires) /lib (18 sous-r´epertoires) /lib32 ( 1 sous-r´epertoires) /lib64 ( 1 sous-r´epertoires) /lost+found ( 1 sous-r´epertoires) /media ( 3 sous-r´epertoires) /mnt ( 2 sous-r´epertoires) /opt ( 5 sous-r´epertoires) /proc (83 sous-r´epertoires) /root ( 1 sous-r´epertoires) ...
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Fonctions r´ ecursives
Une fonction est r´ ecursive si son ex´ ecution peut conduire ` a sa propre invocation.
Sch´ ema d’une fonction r´ ecursive
def f(P): # P = liste de param`etres
# instructions (1)
x = f(Q) # appel avec d'autres param`etres
# instructions (2) return resultat
Le renvoi de valeur n’est pas obligatoire et d´ ependra bien sˆ ur du probl` eme ` a r´ esoudre : certaines fonctions r´ ecursives ne renvoient rien.
7
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Conditions d’arrˆ et
“Une fonction est r´ ecursive si son ex´ ecution
peutconduire ` a sa propre invocation.”
I
Comme avec les boucles, il est facile d’´ ecrire des fonctions qui ne s’arrˆ etent jamais ;
I
Il nous faut donc une condition d’arrˆ et, qui d´ etermine dans
quelle(s) situation(s) les appels r´ ecursifs doivent cesser ;
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Conditions d’arrˆ et
“Une fonction est r´ ecursive si son ex´ ecution
peutconduire ` a sa propre invocation.”
I
Comme avec les boucles, il est facile d’´ ecrire des fonctions qui ne s’arrˆ etent jamais ;
I
Il nous faut donc une condition d’arrˆ et, qui d´ etermine dans quelle(s) situation(s) les appels r´ ecursifs doivent cesser ;
9
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Conditions d’arrˆ et
“Une fonction est r´ ecursive si son ex´ ecution
peutconduire ` a sa propre invocation.”
I
Comme avec les boucles, il est facile d’´ ecrire des fonctions qui ne s’arrˆ etent jamais ;
I
Il nous faut donc une condition d’arrˆ et, qui d´ etermine dans
quelle(s) situation(s) les appels r´ ecursifs doivent cesser ;
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Conditions d’arrˆ et
Il faut bien sˆ ur aussi que la condition d’arrˆ et finisse par ˆ etre v´ erifi´ ee ! Pour ce faire, il faut que les appels r´ ecursifs utilisent d’autres param` etres que l’appel initial.
Exemple 3
Voici deux fonctions r´ ecursives visant ` a r´ ealiser la mˆ eme tˆ ache : Mauvaise fonction r´ ecursive Bonne fonction r´ ecursive
def f(n): # n naturel if n == 0:
print("!") else:
print("*", end="") f(n)
def f(n): # n naturel if n == 0:
print("!") else:
print("*", end="") f(n-1)
La premi` ere fonction ne s’arrˆ ete jamais car si
nne vaut pas 0 au d´ ebut, il ne vaudra jamais 0.
11
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Conditions d’arrˆ et
Il faut bien sˆ ur aussi que la condition d’arrˆ et finisse par ˆ etre v´ erifi´ ee ! Pour ce faire, il faut que les appels r´ ecursifs utilisent d’autres param` etres que l’appel initial.
Exemple 3
Voici deux fonctions r´ ecursives visant ` a r´ ealiser la mˆ eme tˆ ache : Mauvaise fonction r´ ecursive Bonne fonction r´ ecursive
def f(n): # n naturel if n == 0:
print("!") else:
print("*", end="") f(n)
def f(n): # n naturel if n == 0:
print("!") else:
print("*", end="") f(n-1)
La premi` ere fonction ne s’arrˆ ete jamais car si
nne vaut pas 0 au
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Sch´ ema d’une fonction r´ ecursive correcte
Une fonction r´ ecursive correcte se pr´ esente donc comme suit : Sch´ ema d’une fonction r´ ecursive correcte
def f(P): # P = param`etre(s) if test(P): # condition d'arr^et
# bloc sans appel r´ecursif else:
# bloc avec appel(s) r´ecursif(s) sur des
# param`etres "plus simples"
La signification de “plus simple” d´ epend du contexte :
I
si
Pest un naturel et que la condition d’arrˆ et se base sur des petits nombres, alors
P0 <P;
I
si
Pest une liste et que la condition d’arrˆ et v´ erifie si la liste est vide, alors
P0est une liste plus petite ;
I . . .
13
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 1 : nombres de Fibonacci
Pour rappel, le
n`emenombre de Fibonacci
Fnest donn´ e par :
∀n ∈N
:
Fn=
n
si
n≤1,
Fn−1+
Fn−2sinon.
La d´ efinition de ces nombres est une r´ ecurrence, dont les cas de base correspondent ` a la condition d’arrˆ et. On obtient donc directement :
def fibo_rec(n): if n <= 1:
return n
return fibo_rec(n - 1) + fibo_rec(n - 2)
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 1 : nombres de Fibonacci
Pour rappel, le
n`emenombre de Fibonacci
Fnest donn´ e par :
∀n ∈N
:
Fn=
n
si
n≤1,
Fn−1+
Fn−2sinon.
La d´ efinition de ces nombres est une r´ ecurrence, dont les cas de base correspondent ` a la condition d’arrˆ et.
On obtient donc directement :
def fibo_rec(n): if n <= 1:
return n
return fibo_rec(n - 1) + fibo_rec(n - 2)
15
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 1 : nombres de Fibonacci
Pour rappel, le
n`emenombre de Fibonacci
Fnest donn´ e par :
∀n ∈N
:
Fn=
n
si
n≤1,
Fn−1+
Fn−2sinon.
La d´ efinition de ces nombres est une r´ ecurrence, dont les cas de base correspondent ` a la condition d’arrˆ et. On obtient donc directement :
def fibo_rec(n):
if n <= 1:
return n
return fibo_rec(n - 1) + fibo_rec(n - 2)
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Conception d’algorithmes r´ ecursifs basiques
En g´ en´ eral, le probl` eme ` a r´ esoudre n’est pas exprim´ e de mani` ere r´ ecursive ; on doit donc :
1.
trouver une formulation r´ ecursive ;
I si je connais la solution pour une valeur plus “petite / simple / ...”, comment l’utiliser pour r´esoudre mon probl`eme ?
2.
trouver une ou plusieurs conditions d’arrˆ et ;
I dans quels cas puis-je r´esoudre directement le probl`eme ? (liste vide ou petite, valeur dennulle ou petite, ...)
3.
et seulement apr` es, traduire le raisonnement en un algorithme.
Illustrons cette m´ ethode sur quelques exemples.
17
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Conception d’algorithmes r´ ecursifs basiques
En g´ en´ eral, le probl` eme ` a r´ esoudre n’est pas exprim´ e de mani` ere r´ ecursive ; on doit donc :
1.
trouver une formulation r´ ecursive ;
I si je connais la solution pour une valeur plus “petite / simple / ...”, comment l’utiliser pour r´esoudre mon probl`eme ?
2.
trouver une ou plusieurs conditions d’arrˆ et ;
I dans quels cas puis-je r´esoudre directement le probl`eme ? (liste vide ou petite, valeur dennulle ou petite, ...)
3.
et seulement apr` es, traduire le raisonnement en un algorithme.
Illustrons cette m´ ethode sur quelques exemples.
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Conception d’algorithmes r´ ecursifs basiques
En g´ en´ eral, le probl` eme ` a r´ esoudre n’est pas exprim´ e de mani` ere r´ ecursive ; on doit donc :
1.
trouver une formulation r´ ecursive ;
I si je connais la solution pour une valeur plus “petite / simple / ...”, comment l’utiliser pour r´esoudre mon probl`eme ?
2.
trouver une ou plusieurs conditions d’arrˆ et ;
I dans quels cas puis-je r´esoudre directement le probl`eme ? (liste vide ou petite, valeur dennulle ou petite, ...)
3.
et seulement apr` es, traduire le raisonnement en un algorithme.
Illustrons cette m´ ethode sur quelques exemples.
19
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Conception d’algorithmes r´ ecursifs basiques
En g´ en´ eral, le probl` eme ` a r´ esoudre n’est pas exprim´ e de mani` ere r´ ecursive ; on doit donc :
1.
trouver une formulation r´ ecursive ;
I si je connais la solution pour une valeur plus “petite / simple / ...”, comment l’utiliser pour r´esoudre mon probl`eme ?
2.
trouver une ou plusieurs conditions d’arrˆ et ;
I dans quels cas puis-je r´esoudre directement le probl`eme ? (liste vide ou petite, valeur dennulle ou petite, ...)
3.
et seulement apr` es, traduire le raisonnement en un algorithme.
Illustrons cette m´ ethode sur quelques exemples.
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Conception d’algorithmes r´ ecursifs basiques
En g´ en´ eral, le probl` eme ` a r´ esoudre n’est pas exprim´ e de mani` ere r´ ecursive ; on doit donc :
1.
trouver une formulation r´ ecursive ;
I si je connais la solution pour une valeur plus “petite / simple / ...”, comment l’utiliser pour r´esoudre mon probl`eme ?
2.
trouver une ou plusieurs conditions d’arrˆ et ;
I dans quels cas puis-je r´esoudre directement le probl`eme ? (liste vide ou petite, valeur dennulle ou petite, ...)
3.
et seulement apr` es, traduire le raisonnement en un algorithme.
Illustrons cette m´ ethode sur quelques exemples.
21
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Conception d’algorithmes r´ ecursifs basiques
En g´ en´ eral, le probl` eme ` a r´ esoudre n’est pas exprim´ e de mani` ere r´ ecursive ; on doit donc :
1.
trouver une formulation r´ ecursive ;
I si je connais la solution pour une valeur plus “petite / simple / ...”, comment l’utiliser pour r´esoudre mon probl`eme ?
2.
trouver une ou plusieurs conditions d’arrˆ et ;
I dans quels cas puis-je r´esoudre directement le probl`eme ? (liste vide ou petite, valeur dennulle ou petite, ...)
3.
et seulement apr` es, traduire le raisonnement en un algorithme.
Illustrons cette m´ ethode sur quelques exemples.
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 2 : factorielle r´ ecursive
La factorielle de
n ∈Nest
n! =n×(n
−1)
×(n
−2)
× · · · ×2
×1, avec le cas particulier 0! = 1.
1.
trouver une formulation r´ ecursive : remarquons que :
n! =n×
=(n−1)!
z }| {
(n
−1)
×(n
−2)
× · · · ×2
×1
=
n×(n
−1)!
2.
trouver une condition d’arrˆ et : voir la d´ efinition : si
n ≤1, alors
n! = 1.On peut donc r´ e´ ecrire la d´ efinition de mani` ere r´ ecursive :
∀n ∈N
:
n! =
1 si
n≤1,
n×(n
−1)! sinon.
23
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 2 : factorielle r´ ecursive
La factorielle de
n ∈Nest
n! =n×(n
−1)
×(n
−2)
× · · · ×2
×1, avec le cas particulier 0! = 1.
1.
trouver une formulation r´ ecursive : remarquons que :
n! =n×
=(n−1)!
z }| {
(n
−1)
×(n
−2)
× · · · ×2
×1
=
n×(n
−1)!
2.
trouver une condition d’arrˆ et : voir la d´ efinition : si
n ≤1, alors
n! = 1.On peut donc r´ e´ ecrire la d´ efinition de mani` ere r´ ecursive :
∀n ∈N
:
n! =
1 si
n≤1,
n×(n
−1)! sinon.
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 2 : factorielle r´ ecursive
La factorielle de
n ∈Nest
n! =n×(n
−1)
×(n
−2)
× · · · ×2
×1, avec le cas particulier 0! = 1.
1.
trouver une formulation r´ ecursive : remarquons que :
n! =n×
=(n−1)!
z }| {
(n
−1)
×(n
−2)
× · · · ×2
×1
=
n×(n
−1)!
2.
trouver une condition d’arrˆ et : voir la d´ efinition : si
n ≤1, alors
n! = 1.On peut donc r´ e´ ecrire la d´ efinition de mani` ere r´ ecursive :
∀n ∈N
:
n! =
1 si
n≤1,
n×(n
−1)! sinon.
25
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 2 : factorielle r´ ecursive
La factorielle de
n ∈Nest
n! =n×(n
−1)
×(n
−2)
× · · · ×2
×1, avec le cas particulier 0! = 1.
1.
trouver une formulation r´ ecursive : remarquons que :
n! =n×
=(n−1)!
z }| {
(n
−1)
×(n
−2)
× · · · ×2
×1 =
n×(n
−1)!
2.
trouver une condition d’arrˆ et : voir la d´ efinition : si
n ≤1, alors
n! = 1.On peut donc r´ e´ ecrire la d´ efinition de mani` ere r´ ecursive :
∀n ∈N
:
n! =
1 si
n≤1,
n×(n
−1)! sinon.
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 2 : factorielle r´ ecursive
La factorielle de
n ∈Nest
n! =n×(n
−1)
×(n
−2)
× · · · ×2
×1, avec le cas particulier 0! = 1.
1.
trouver une formulation r´ ecursive : remarquons que :
n! =n×
=(n−1)!
z }| {
(n
−1)
×(n
−2)
× · · · ×2
×1 =
n×(n
−1)!
2.
trouver une condition d’arrˆ et : voir la d´ efinition : si
n ≤1, alors
n! = 1.On peut donc r´ e´ ecrire la d´ efinition de mani` ere r´ ecursive :
∀n ∈N
:
n! =
1 si
n≤1,
n×(n
−1)! sinon.
27
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 2 : factorielle r´ ecursive
La factorielle de
n ∈Nest
n! =n×(n
−1)
×(n
−2)
× · · · ×2
×1, avec le cas particulier 0! = 1.
1.
trouver une formulation r´ ecursive : remarquons que :
n! =n×
=(n−1)!
z }| {
(n
−1)
×(n
−2)
× · · · ×2
×1 =
n×(n
−1)!
2.
trouver une condition d’arrˆ et : voir la d´ efinition : si
n ≤1, alors
n! = 1. On peut donc r´e´ ecrire la d´ efinition de mani` ere r´ ecursive :
∀n ∈N
:
n! =
1 si
n≤1,
n×(n
−1)! sinon.
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 2 : factorielle r´ ecursive
∀ n∈N
:
n! =
1 si
n ≤1,
n×(n
−1)! sinon.
Une fois le travail r´ ealis´ e, il n’y a plus qu’` a traduire la d´ efinition r´ ecursive en code :
def facto_rec(n):
"""Renvoie la factorielle du naturel n."""
if n <= 1:
return 1
return n * facto_rec(n - 1)
29
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 3 : puissance r´ ecursive
On a d´ ej` a vu comment calculer
ande mani` ere it´ erative dans le cas o` u
n∈N. Pour pouvoir calculer ce nombre de mani`ere r´ ecursive, appliquons la m´ ethodologie que l’on a suivie dans le cas de la factorielle :
1.
trouver une formulation r´ ecursive : remarquons que :
an
=
n
facteurs
z }| {
a×a× · · · ×a
=
a×n−
1 facteurs
z }| {
a×a× · · · ×a
=
a×an−12.
trouver une condition d’arrˆ et : le plus petit naturel est
n= 0, auquel cas
an= 1.
On obtient
∀ a∈R,∀n ∈N
:
an=
1 si
n= 0,
a×an−1sinon.
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 3 : puissance r´ ecursive
On a d´ ej` a vu comment calculer
ande mani` ere it´ erative dans le cas o` u
n∈N. Pour pouvoir calculer ce nombre de mani`ere r´ ecursive, appliquons la m´ ethodologie que l’on a suivie dans le cas de la factorielle :
1.
trouver une formulation r´ ecursive : remarquons que :
an
=
n
facteurs
z }| {
a×a× · · · ×a
=
a×n−
1 facteurs
z }| {
a×a× · · · ×a
=
a×an−12.
trouver une condition d’arrˆ et : le plus petit naturel est
n= 0, auquel cas
an= 1.
On obtient
∀ a∈R,∀n ∈N
:
an=
1 si
n= 0,
a×an−1sinon.
31
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 3 : puissance r´ ecursive
On a d´ ej` a vu comment calculer
ande mani` ere it´ erative dans le cas o` u
n∈N. Pour pouvoir calculer ce nombre de mani`ere r´ ecursive, appliquons la m´ ethodologie que l’on a suivie dans le cas de la factorielle :
1.
trouver une formulation r´ ecursive : remarquons que :
an
=
n
facteurs
z }| {
a×a× · · · ×a
=
a×n−
1 facteurs
z }| {
a×a× · · · ×a
=
a×an−12.
trouver une condition d’arrˆ et : le plus petit naturel est
n= 0, auquel cas
an= 1.
On obtient
∀ a∈R,∀n ∈N
:
an=
1 si
n= 0,
a×an−1sinon.
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 3 : puissance r´ ecursive
On a d´ ej` a vu comment calculer
ande mani` ere it´ erative dans le cas o` u
n∈N. Pour pouvoir calculer ce nombre de mani`ere r´ ecursive, appliquons la m´ ethodologie que l’on a suivie dans le cas de la factorielle :
1.
trouver une formulation r´ ecursive : remarquons que :
an
=
n
facteurs
z }| {
a×a× · · · ×a
=
a×n−
1 facteurs
z }| {
a×a× · · · ×a
=
a×an−12.
trouver une condition d’arrˆ et : le plus petit naturel est
n= 0, auquel cas
an= 1.
On obtient
∀ a∈R,∀n ∈N
:
an=
1 si
n= 0,
a×an−1sinon.
33
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 3 : puissance r´ ecursive
On a d´ ej` a vu comment calculer
ande mani` ere it´ erative dans le cas o` u
n∈N. Pour pouvoir calculer ce nombre de mani`ere r´ ecursive, appliquons la m´ ethodologie que l’on a suivie dans le cas de la factorielle :
1.
trouver une formulation r´ ecursive : remarquons que :
an
=
n
facteurs
z }| {
a×a× · · · ×a
=
a×n−
1 facteurs
z }| {
a×a× · · · ×a
=
a×an−12.
trouver une condition d’arrˆ et : le plus petit naturel est
n= 0, auquel cas
an= 1.
On obtient
∀ a∈R,∀n ∈N
:
an=
1 si
n= 0,
a×an−1sinon.
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 3 : puissance r´ ecursive
On a d´ ej` a vu comment calculer
ande mani` ere it´ erative dans le cas o` u
n∈N. Pour pouvoir calculer ce nombre de mani`ere r´ ecursive, appliquons la m´ ethodologie que l’on a suivie dans le cas de la factorielle :
1.
trouver une formulation r´ ecursive : remarquons que :
an
=
n
facteurs
z }| {
a×a× · · · ×a
=
a×n−
1 facteurs
z }| {
a×a× · · · ×a
=
a×an−12.
trouver une condition d’arrˆ et : le plus petit naturel est
n= 0, auquel cas
an= 1. On obtient
∀ a∈R,∀n ∈N
:
an=
1 si
n= 0,
a×an−1sinon.
35
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Exemple 3 : puissance r´ ecursive
∀a∈R,∀ n∈N
:
an=
1 si
n= 0,
a×an−1sinon.
On d´ eduit facilement le code ` a ´ ecrire de la d´ efinition que l’on vient d’obtenir :
def puiss_rec(a, n):
"""Renvoie le r´eel a ´elev´e `a la puissance naturelle n."""
if n == 0:
return 1
return a * puiss_rec(a, n - 1)
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Complexit´ e des algorithmes r´ ecursifs
I
On sait comment calculer la complexit´ e des algorithmes it´ eratifs ; que faire pour les algorithmes r´ ecursifs ?
I
Les r` egles ne changent pas ; on remplace le nombre
“d’it´ erations” par le nombre d’appels r´ ecursifs ;
def facto_rec(n): if n <= 1:
return 1
return n * facto_rec(n - 1)
def puiss_rec(a, n): if n == 0:
return 1
return a * puiss_rec(a, n - 1)
. . . et pour Fibonacci ?
def fibo_rec(n): if n <= 1:
return n
return fibo_rec(n - 1) + fibo_rec(n - 2)
37
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Complexit´ e des algorithmes r´ ecursifs
I
On sait comment calculer la complexit´ e des algorithmes it´ eratifs ; que faire pour les algorithmes r´ ecursifs ?
ILes r` egles ne changent pas ; on remplace le nombre
“d’it´ erations” par le nombre d’appels r´ ecursifs ;
def facto_rec(n): if n <= 1:
return 1
return n * facto_rec(n - 1)
def puiss_rec(a, n): if n == 0:
return 1
return a * puiss_rec(a, n - 1)
. . . et pour Fibonacci ?
def fibo_rec(n): if n <= 1:
return n
return fibo_rec(n - 1) + fibo_rec(n - 2)
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Complexit´ e des algorithmes r´ ecursifs
I
On sait comment calculer la complexit´ e des algorithmes it´ eratifs ; que faire pour les algorithmes r´ ecursifs ?
ILes r` egles ne changent pas ; on remplace le nombre
“d’it´ erations” par le nombre d’appels r´ ecursifs ;
def facto_rec(n):
if n <= 1:
return 1
return n * facto_rec(n - 1)
def puiss_rec(a, n): if n == 0:
return 1
return a * puiss_rec(a, n - 1)
. . . et pour Fibonacci ?
def fibo_rec(n): if n <= 1:
return n
return fibo_rec(n - 1) + fibo_rec(n - 2)
39
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Complexit´ e des algorithmes r´ ecursifs
I
On sait comment calculer la complexit´ e des algorithmes it´ eratifs ; que faire pour les algorithmes r´ ecursifs ?
ILes r` egles ne changent pas ; on remplace le nombre
“d’it´ erations” par le nombre d’appels r´ ecursifs ;
def facto_rec(n):
if n <= 1:
return 1
return n * facto_rec(n - 1)
def puiss_rec(a, n):
if n == 0:
return 1
return a * puiss_rec(a, n - 1)
. . . et pour Fibonacci ?
def fibo_rec(n): if n <= 1:
return n
return fibo_rec(n - 1) + fibo_rec(n - 2)
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Complexit´ e des algorithmes r´ ecursifs
I
On sait comment calculer la complexit´ e des algorithmes it´ eratifs ; que faire pour les algorithmes r´ ecursifs ?
ILes r` egles ne changent pas ; on remplace le nombre
“d’it´ erations” par le nombre d’appels r´ ecursifs ;
def facto_rec(n):
if n <= 1:
return 1
return n * facto_rec(n - 1)
def puiss_rec(a, n):
if n == 0:
return 1
return a * puiss_rec(a, n - 1)
. . . et pour Fibonacci ?
def fibo_rec(n):
if n <= 1:
return n
return fibo_rec(n - 1) + fibo_rec(n - 2)
41
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Arbres d’appels
L’arbre d’appelsd’une fonction contient :
I un nœud par appel ;
I un lien de chaque appel vers tous ceux qu’il d´eclenche.
Le nombre de nœuds permet d’´evaluer la complexit´e de la fonction r´ecursive.
Exemple 4 (arbre d’appels de fibo_rec(5))
fiboR(5)
fiboR(4)
fiboR(3)
fiboR(2)
fiboR(1) fiboR(0) fiboR(1)
fiboR(2)
fiboR(1) fiboR(0)
fiboR(3)
fiboR(2)
fiboR(1) fiboR(0)
fiboR(1)
Chaque appel en d´eclenche deux⇒O(2n) !
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Arbres d’appels
L’arbre d’appelsd’une fonction contient : I un nœud par appel ;
I un lien de chaque appel vers tous ceux qu’il d´eclenche.
Le nombre de nœuds permet d’´evaluer la complexit´e de la fonction r´ecursive.
Exemple 4 (arbre d’appels de fibo_rec(5))
fiboR(5)
fiboR(4)
fiboR(3)
fiboR(2)
fiboR(1) fiboR(0) fiboR(1)
fiboR(2)
fiboR(1) fiboR(0)
fiboR(3)
fiboR(2)
fiboR(1) fiboR(0)
fiboR(1)
Chaque appel en d´eclenche deux⇒O(2n) !
43
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Arbres d’appels
L’arbre d’appelsd’une fonction contient : I un nœud par appel ;
I un lien de chaque appel vers tous ceux qu’il d´eclenche.
Le nombre de nœuds permet d’´evaluer la complexit´e de la fonction r´ecursive.
Exemple 4 (arbre d’appels de fibo_rec(5))
fiboR(5)
fiboR(4)
fiboR(3)
fiboR(2)
fiboR(1) fiboR(0) fiboR(1)
fiboR(2)
fiboR(1) fiboR(0)
fiboR(3)
fiboR(2)
fiboR(1) fiboR(0)
fiboR(1)
Chaque appel en d´eclenche deux⇒O(2n) !
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Arbres d’appels
L’arbre d’appelsd’une fonction contient : I un nœud par appel ;
I un lien de chaque appel vers tous ceux qu’il d´eclenche.
Le nombre de nœuds permet d’´evaluer la complexit´e de la fonction r´ecursive.
Exemple 4 (arbre d’appels de fibo_rec(5))
fiboR(5)
fiboR(4)
fiboR(3)
fiboR(2)
fiboR(1) fiboR(0) fiboR(1)
fiboR(2)
fiboR(1) fiboR(0)
fiboR(3)
fiboR(2)
fiboR(1) fiboR(0)
fiboR(1)
Chaque appel en d´eclenche deux⇒O(2n) !
45
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Arbres d’appels
L’arbre d’appelsd’une fonction contient : I un nœud par appel ;
I un lien de chaque appel vers tous ceux qu’il d´eclenche.
Le nombre de nœuds permet d’´evaluer la complexit´e de la fonction r´ecursive.
Exemple 4 (arbre d’appels de fibo_rec(5))
fiboR(5)
fiboR(4)
fiboR(3)
fiboR(2)
fiboR(1) fiboR(0) fiboR(1)
fiboR(2)
fiboR(1) fiboR(0)
fiboR(3)
fiboR(2)
fiboR(1) fiboR(0)
fiboR(1)
Chaque appel en d´eclenche deux⇒O(2n) !
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Arbres d’appels
L’arbre d’appelsd’une fonction contient : I un nœud par appel ;
I un lien de chaque appel vers tous ceux qu’il d´eclenche.
Le nombre de nœuds permet d’´evaluer la complexit´e de la fonction r´ecursive.
Exemple 4 (arbre d’appels de fibo_rec(5))
fiboR(5)
fiboR(4)
fiboR(3)
fiboR(2)
fiboR(1) fiboR(0) fiboR(1)
fiboR(2)
fiboR(1) fiboR(0)
fiboR(3)
fiboR(2)
fiboR(1) fiboR(0)
fiboR(1)
Chaque appel en d´eclenche deux⇒O(2n) !
47
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Contextes et pile d’appels
Lecontexted’une fonction est l’ensemble des variables (et de leurs valeurs) qu’elle utilise.
Lorsqu’on appelle une fonction, on interrompt le flux du programme :
d´ebut
appel
ex´ecution de la fonction
retour
I Pour revenir au point de d´epart, il faut sauvegarder les donn´ees et l’´etat ; I Ces donn´ees se retrouvent sur lapile d’appels;
I Chaque appel (r´ecursif ou non) empile un contexte ... I ... et a donc un impact direct sur la complexit´e spatiale ;
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Contextes et pile d’appels
Lecontexted’une fonction est l’ensemble des variables (et de leurs valeurs) qu’elle utilise. Lorsqu’on appelle une fonction, on interrompt le flux du programme :
d´ebut
appel
ex´ecution de la fonction
retour
I Pour revenir au point de d´epart, il faut sauvegarder les donn´ees et l’´etat ; I Ces donn´ees se retrouvent sur lapile d’appels;
I Chaque appel (r´ecursif ou non) empile un contexte ... I ... et a donc un impact direct sur la complexit´e spatiale ;
49
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Contextes et pile d’appels
Lecontexted’une fonction est l’ensemble des variables (et de leurs valeurs) qu’elle utilise. Lorsqu’on appelle une fonction, on interrompt le flux du programme :
d´ebut
appel
ex´ecution de la fonction
retour
I Pour revenir au point de d´epart, il faut sauvegarder les donn´ees et l’´etat ; I Ces donn´ees se retrouvent sur lapile d’appels;
I Chaque appel (r´ecursif ou non) empile un contexte ... I ... et a donc un impact direct sur la complexit´e spatiale ;
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Contextes et pile d’appels
Lecontexted’une fonction est l’ensemble des variables (et de leurs valeurs) qu’elle utilise. Lorsqu’on appelle une fonction, on interrompt le flux du programme :
d´ebut
appel
ex´ecution de la fonction
retour
I Pour revenir au point de d´epart, il faut sauvegarder les donn´ees et l’´etat ; I Ces donn´ees se retrouvent sur lapile d’appels;
I Chaque appel (r´ecursif ou non) empile un contexte ... I ... et a donc un impact direct sur la complexit´e spatiale ;
51
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Contextes et pile d’appels
Lecontexted’une fonction est l’ensemble des variables (et de leurs valeurs) qu’elle utilise. Lorsqu’on appelle une fonction, on interrompt le flux du programme :
d´ebut
appel
ex´ecution de la fonction
retour
I Pour revenir au point de d´epart, il faut sauvegarder les donn´ees et l’´etat ; I Ces donn´ees se retrouvent sur lapile d’appels;
I Chaque appel (r´ecursif ou non) empile un contexte ... I ... et a donc un impact direct sur la complexit´e spatiale ;
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Contextes et pile d’appels
Lecontexted’une fonction est l’ensemble des variables (et de leurs valeurs) qu’elle utilise. Lorsqu’on appelle une fonction, on interrompt le flux du programme :
d´ebut
appel
ex´ecution de la fonction
retour
I Pour revenir au point de d´epart, il faut sauvegarder les donn´ees et l’´etat ;
I Ces donn´ees se retrouvent sur lapile d’appels; I Chaque appel (r´ecursif ou non) empile un contexte ... I ... et a donc un impact direct sur la complexit´e spatiale ;
53
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Contextes et pile d’appels
Lecontexted’une fonction est l’ensemble des variables (et de leurs valeurs) qu’elle utilise. Lorsqu’on appelle une fonction, on interrompt le flux du programme :
d´ebut
appel
ex´ecution de la fonction
retour
I Pour revenir au point de d´epart, il faut sauvegarder les donn´ees et l’´etat ; I Ces donn´ees se retrouvent sur lapile d’appels;
I Chaque appel (r´ecursif ou non) empile un contexte ... I ... et a donc un impact direct sur la complexit´e spatiale ;
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Contextes et pile d’appels
Lecontexted’une fonction est l’ensemble des variables (et de leurs valeurs) qu’elle utilise. Lorsqu’on appelle une fonction, on interrompt le flux du programme :
d´ebut
appel
ex´ecution de la fonction
retour
I Pour revenir au point de d´epart, il faut sauvegarder les donn´ees et l’´etat ; I Ces donn´ees se retrouvent sur lapile d’appels;
I Chaque appel (r´ecursif ou non) empile un contexte ...
I ... et a donc un impact direct sur la complexit´e spatiale ;
55
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Contextes et pile d’appels
Lecontexted’une fonction est l’ensemble des variables (et de leurs valeurs) qu’elle utilise. Lorsqu’on appelle une fonction, on interrompt le flux du programme :
d´ebut
appel
ex´ecution de la fonction
retour
I Pour revenir au point de d´epart, il faut sauvegarder les donn´ees et l’´etat ; I Ces donn´ees se retrouvent sur lapile d’appels;
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Impact des appels r´ ecursifs sur la pile d’appels
d´ebut
appel 1
retour 1
appel 2
retour 2
appel 3
retour 3
. . .
pr´e appel 1
pr´e appel 2 pr´e appel 3
.. .
Les fonctions
facto_recet
puiss_recconsomment donc un espace m´ emoire en
O(n) ... et la consommation de
fibo_recest en
O(2n).
57
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Impact des appels r´ ecursifs sur la pile d’appels
d´ebut appel 1
retour 1
appel 2
retour 2
appel 3
retour 3
. . .
pr´e appel 1
pr´e appel 2 pr´e appel 3
.. .
Les fonctions
facto_recet
puiss_recconsomment donc un
espace m´ emoire en
O(n) ... et la consommation de
fibo_recest
en
O(2n).
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Impact des appels r´ ecursifs sur la pile d’appels
d´ebut appel 1
retour 1
appel 2
retour 2
appel 3
retour 3
. . .
pr´e appel 1 pr´e appel 2
pr´e appel 3
.. .
Les fonctions
facto_recet
puiss_recconsomment donc un espace m´ emoire en
O(n) ... et la consommation de
fibo_recest en
O(2n).
59
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Impact des appels r´ ecursifs sur la pile d’appels
d´ebut appel 1
retour 1
appel 2
retour 2
appel 3
retour 3
. . .
pr´e appel 1 pr´e appel 2
pr´e appel 3
.. .
Les fonctions
facto_recet
puiss_recconsomment donc un
espace m´ emoire en
O(n) ... et la consommation de
fibo_recest
en
O(2n).
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Impact des appels r´ ecursifs sur la pile d’appels
d´ebut appel 1
retour 1
appel 2
retour 2
appel 3
retour 3
. . .
pr´e appel 1 pr´e appel 2 pr´e appel 3
.. .
Les fonctions
facto_recet
puiss_recconsomment donc un espace m´ emoire en
O(n) ... et la consommation de
fibo_recest en
O(2n).
61
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Impact des appels r´ ecursifs sur la pile d’appels
d´ebut appel 1
retour 1
appel 2
retour 2
appel 3
retour 3
. . .
pr´e appel 1 pr´e appel 2 pr´e appel 3
.. .
Les fonctions
facto_recet
puiss_recconsomment donc un
espace m´ emoire en
O(n) ... et la consommation de
fibo_recest
en
O(2n).
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Impact des appels r´ ecursifs sur la pile d’appels
d´ebut appel 1
retour 1
appel 2
retour 2
appel 3
retour 3
. . .
pr´e appel 1 pr´e appel 2 pr´e appel 3
.. .
Les fonctions
facto_recet
puiss_recconsomment donc un espace m´ emoire en
O(n) ... et la consommation de
fibo_recest en
O(2n).
63
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Nombre limit´ e d’appels r´ ecursifs
I
La pile d’appels poss` ede une taille limit´ ee ;
I
Donc Python limite le nombre d’appels r´ ecursifs que l’on peut effectuer ;
Exemple 5 (trop d’appels r´ ecursifs)
facto_rec
s’ex´ ecute sans probl` eme ... jusqu’` a une certaine valeur :
>>> facto_rec(997)
# ok, le r´esultat s'affiche
>>> facto_rec(998)
...
RuntimeError: maximum recursion depth exceeded in comparison
Cette erreur survient quand :
I
le code est correct mais le nombre d’appels r´ ecursifs est trop grand ;
I
les appels r´ ecursifs sont “infinis” ; dans ce cas, v´ erifiez vos
conditions d’arrˆ et et vos appels r´ ecursifs ;
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Nombre limit´ e d’appels r´ ecursifs
I
La pile d’appels poss` ede une taille limit´ ee ;
I
Donc Python limite le nombre d’appels r´ ecursifs que l’on peut effectuer ;
Exemple 5 (trop d’appels r´ ecursifs)
facto_rec
s’ex´ ecute sans probl` eme ... jusqu’` a une certaine valeur :
>>> facto_rec(997)
# ok, le r´esultat s'affiche
>>> facto_rec(998)
...
RuntimeError: maximum recursion depth exceeded in comparison
Cette erreur survient quand :
I
le code est correct mais le nombre d’appels r´ ecursifs est trop grand ;
I
les appels r´ ecursifs sont “infinis” ; dans ce cas, v´ erifiez vos conditions d’arrˆ et et vos appels r´ ecursifs ;
65
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Nombre limit´ e d’appels r´ ecursifs
I
La pile d’appels poss` ede une taille limit´ ee ;
I
Donc Python limite le nombre d’appels r´ ecursifs que l’on peut effectuer ;
Exemple 5 (trop d’appels r´ ecursifs)
facto_rec
s’ex´ ecute sans probl` eme ... jusqu’` a une certaine valeur :
>>> facto_rec(997)
# ok, le r´esultat s'affiche
>>> facto_rec(998)
...
RuntimeError: maximum recursion depth exceeded in comparison
Cette erreur survient quand :
I
le code est correct mais le nombre d’appels r´ ecursifs est trop grand ;
I
les appels r´ ecursifs sont “infinis” ; dans ce cas, v´ erifiez vos
conditions d’arrˆ et et vos appels r´ ecursifs ;
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Nombre limit´ e d’appels r´ ecursifs
I
La pile d’appels poss` ede une taille limit´ ee ;
I
Donc Python limite le nombre d’appels r´ ecursifs que l’on peut effectuer ;
Exemple 5 (trop d’appels r´ ecursifs)
facto_rec
s’ex´ ecute sans probl` eme ... jusqu’` a une certaine valeur :
>>> facto_rec(997)
# ok, le r´esultat s'affiche
>>> facto_rec(998)
...
RuntimeError: maximum recursion depth exceeded in comparison
Cette erreur survient quand :
I
le code est correct mais le nombre d’appels r´ ecursifs est trop grand ;
I
les appels r´ ecursifs sont “infinis” ; dans ce cas, v´ erifiez vos conditions d’arrˆ et et vos appels r´ ecursifs ;
67
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Nombre limit´ e d’appels r´ ecursifs
I
La pile d’appels poss` ede une taille limit´ ee ;
I
Donc Python limite le nombre d’appels r´ ecursifs que l’on peut effectuer ;
Exemple 5 (trop d’appels r´ ecursifs)
facto_rec
s’ex´ ecute sans probl` eme ... jusqu’` a une certaine valeur :
>>> facto_rec(997)
# ok, le r´esultat s'affiche
>>> facto_rec(998)
...
RuntimeError: maximum recursion depth exceeded in comparison
Cette erreur survient quand :
I
le code est correct mais le nombre d’appels r´ ecursifs est trop grand ;
I
les appels r´ ecursifs sont “infinis” ; dans ce cas, v´ erifiez vos
conditions d’arrˆ et et vos appels r´ ecursifs ;
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Nombre limit´ e d’appels r´ ecursifs
I
La pile d’appels poss` ede une taille limit´ ee ;
I
Donc Python limite le nombre d’appels r´ ecursifs que l’on peut effectuer ;
Exemple 5 (trop d’appels r´ ecursifs)
facto_rec
s’ex´ ecute sans probl` eme ... jusqu’` a une certaine valeur :
>>> facto_rec(997)
# ok, le r´esultat s'affiche
>>> facto_rec(998)
...
RuntimeError: maximum recursion depth exceeded in comparison
Cette erreur survient quand :
I
le code est correct mais le nombre d’appels r´ ecursifs est trop grand ;
I
les appels r´ ecursifs sont “infinis” ; dans ce cas, v´ erifiez vos conditions d’arrˆ et et vos appels r´ ecursifs ;
69
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Fonctions auxiliaires
I
Il est parfois utile de disposer d’une fonction auxiliaire pour
“cacher” la r´ ecursivit´ e ;
I
Elle sera utile :
I quand il est n´ecessaire de distinguer l’appel initial des appels r´ecursifs ;
I quand on aura besoin de param`etres suppl´ementaires qu’on ne veut pas demander `a l’utilisateur
Exemple 6
def fonction_auxiliaire(parametres_originaux):
# initialisation de param`etres suppl´ementaires fonction_recursive(
parametres_originaux, parametres_supplementaires )
Ce concept nous servira surtout pour la r´ ecursivit´ e sur des
it´ erables.
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Fonctions auxiliaires
I
Il est parfois utile de disposer d’une fonction auxiliaire pour
“cacher” la r´ ecursivit´ e ;
IElle sera utile :
I quand il est n´ecessaire de distinguer l’appel initial des appels r´ecursifs ;
I quand on aura besoin de param`etres suppl´ementaires qu’on ne veut pas demander `a l’utilisateur
Exemple 6
def fonction_auxiliaire(parametres_originaux):
# initialisation de param`etres suppl´ementaires fonction_recursive(
parametres_originaux, parametres_supplementaires )
Ce concept nous servira surtout pour la r´ ecursivit´ e sur des it´ erables.
71
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Fonctions auxiliaires
I
Il est parfois utile de disposer d’une fonction auxiliaire pour
“cacher” la r´ ecursivit´ e ;
IElle sera utile :
I quand il est n´ecessaire de distinguer l’appel initial des appels r´ecursifs ;
I quand on aura besoin de param`etres suppl´ementaires qu’on ne veut pas demander `a l’utilisateur
Exemple 6
def fonction_auxiliaire(parametres_originaux):
# initialisation de param`etres suppl´ementaires fonction_recursive(
parametres_originaux, parametres_supplementaires )
Ce concept nous servira surtout pour la r´ ecursivit´ e sur des
it´ erables.
Principes de base Algorithmes r´ecursifs basiques Coˆut en temps et en m´emoire des algorithmes r´ecursifs Fonctions auxiliaires
Fonctions auxiliaires
I
Il est parfois utile de disposer d’une fonction auxiliaire pour
“cacher” la r´ ecursivit´ e ;
IElle sera utile :
I quand il est n´ecessaire de distinguer l’appel initial des appels r´ecursifs ;
I quand on aura besoin de param`etres suppl´ementaires qu’on ne veut pas demander `a l’utilisateur
Exemple 6
def fonction_auxiliaire(parametres_originaux):
# initialisation de param`etres suppl´ementaires fonction_recursive(
parametres_originaux, parametres_supplementaires )
Ce concept nous servira surtout pour la r´ ecursivit´ e sur des it´ erables.
73