• Aucun résultat trouvé

Structures de donn´ees et algorithmes fondamentaux

N/A
N/A
Protected

Academic year: 2022

Partager "Structures de donn´ees et algorithmes fondamentaux"

Copied!
81
0
0

Texte intégral

(1)

Structures de donn´ ees et algorithmes fondamentaux

R´ecursivit´e

Anthony Labarre

Universit´e Gustave Eiffel

4 novembre 2020

(2)

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 ;

I

fractale = ligne polygonale “fractalis´ ee” ;

3

(4)

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 ;

(5)

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

(6)

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) ...

(7)

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

(8)

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

peut

conduire ` 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

peut

conduire ` 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

(10)

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

peut

conduire ` 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 ;

(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

n

ne vaut pas 0 au d´ ebut, il ne vaudra jamais 0.

11

(12)

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

n

ne vaut pas 0 au

(13)

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

P

est un naturel et que la condition d’arrˆ et se base sur des petits nombres, alors

P0 <P

;

I

si

P

est une liste et que la condition d’arrˆ et v´ erifie si la liste est vide, alors

P0

est une liste plus petite ;

I . . .

13

(14)

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`eme

nombre de Fibonacci

Fn

est donn´ e par :

∀n ∈N

:

Fn

=

n

si

n≤

1,

Fn−1

+

Fn−2

sinon.

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`eme

nombre de Fibonacci

Fn

est donn´ e par :

∀n ∈N

:

Fn

=

n

si

n≤

1,

Fn−1

+

Fn−2

sinon.

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

(16)

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`eme

nombre de Fibonacci

Fn

est donn´ e par :

∀n ∈N

:

Fn

=

n

si

n≤

1,

Fn−1

+

Fn−2

sinon.

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)

(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.

17

(18)

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.

19

(20)

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.

21

(22)

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.

(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 ∈N

est

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

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

1)! sinon.

23

(24)

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 ∈N

est

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

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

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 ∈N

est

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

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

1)! sinon.

25

(26)

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 ∈N

est

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

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

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 ∈N

est

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

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

1)! sinon.

27

(28)

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 ∈N

est

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

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

1)! sinon.

(29)

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

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

(30)

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

an

de 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

=

n−

1 facteurs

z }| {

a×a× · · · ×a

=

a×an−1

2.

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−1

sinon.

(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

an

de 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

=

n−

1 facteurs

z }| {

a×a× · · · ×a

=

a×an−1

2.

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−1

sinon.

31

(32)

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

an

de 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

=

n−

1 facteurs

z }| {

a×a× · · · ×a

=

a×an−1

2.

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−1

sinon.

(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

an

de 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

=

n−

1 facteurs

z }| {

a×a× · · · ×a

=

a×an−1

2.

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−1

sinon.

33

(34)

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

an

de 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

=

n−

1 facteurs

z }| {

a×a× · · · ×a

=

a×an−1

2.

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−1

sinon.

(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

On a d´ ej` a vu comment calculer

an

de 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

=

n−

1 facteurs

z }| {

a×a× · · · ×a

=

a×an−1

2.

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−1

sinon.

35

(36)

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−1

sinon.

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)

(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 ?

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

(38)

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)

(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 ?

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)

39

(40)

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)

(41)

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)

41

(42)

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) !

43

(44)

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) !

45

(46)

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

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

(48)

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 :

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 :

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

(50)

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 :

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 :

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

(52)

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 :

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 :

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

(54)

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 :

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 :

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

(56)

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 :

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;

(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

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_rec

et

puiss_rec

consomment donc un espace m´ emoire en

O

(n) ... et la consommation de

fibo_rec

est en

O(2n

).

57

(58)

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

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_rec

et

puiss_rec

consomment donc un

espace m´ emoire en

O

(n) ... et la consommation de

fibo_rec

est

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

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_rec

et

puiss_rec

consomment donc un espace m´ emoire en

O

(n) ... et la consommation de

fibo_rec

est en

O(2n

).

59

(60)

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

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_rec

et

puiss_rec

consomment donc un

espace m´ emoire en

O

(n) ... et la consommation de

fibo_rec

est

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

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_rec

et

puiss_rec

consomment donc un espace m´ emoire en

O

(n) ... et la consommation de

fibo_rec

est en

O(2n

).

61

(62)

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

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_rec

et

puiss_rec

consomment donc un

espace m´ emoire en

O

(n) ... et la consommation de

fibo_rec

est

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

Impact des appels r´ ecursifs sur la pile d’appels

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_rec

et

puiss_rec

consomment donc un espace m´ emoire en

O

(n) ... et la consommation de

fibo_rec

est en

O(2n

).

63

(64)

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 ;

65

(66)

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 ;

67

(68)

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

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

(70)

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.

(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 ;

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.

71

(72)

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.

(73)

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.

73

Références

Documents relatifs

Compare pages obtained by probing with the error page (by clustering along the DOM tree structure of the pages), to distinguish error pages and result pages.. Confirm the annotation

Soyez toujours le plus pr´ ecis possible dans le choix de votre notation (Ω, O ou Θ) et justifiez votre r´ eponse...

[r]

Recherche dichotomique d’un ´ el´ ement dans un tableau Question principale du jour :.. Comment ´ ecrire ce que l’on ne connait pas

[r]

L’it´ eration de la division enti` ere par 2 m` ene ` a 0, et le case de base 0 se termine par l’ex´ ecution de retourner.. – puissance se termine si on remplace l’appel `

Si l’algorithme se termine pour la valeur n−1 alors il se termine aussi pour la valeur n est excutant retourner.. – somme ne se termine pas lorsque n est

En un sommet de la grille donn´ e on a le choix de monter ou d’avancer, le nombre de chemin est donc la somme des nombres de chemins qui commen¸ cent par monter (Chemin(l −1, L)) et