Cours de Recursivite

Vous aimerez peut-être aussi

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 8

CPGE Alcachy 2016-2017

LA Récursivité Algorithmique

1- Rappel
 L'approche efficace pour résoudre un problème complexe consiste souvent à le décomposer en plusieurs
sous-problèmes plus simples qui seront étudiés séparément.
 D'autre part, il arrive souvent qu'une même séquence d'instructions sera utilisée à plusieurs reprises dans un
programme, et on souhaite évidemment ne pas avoir à la reproduire systématiquement.
 Leconceptdelaprogrammationmodulairepermetde résoudreles difficultés évoquées ci-dessus
enutilisantlanotiondefonction(sous-programme).
 Unefonctionpeutappeleruneautrefonction.Uncasparticulierellepeutappelerelle-
même,c'estl'objectifdececours.

Syntaxe d’une fonction en python

La syntaxe Python pour la définition d'une fonction est la suivante:

defnomfonction(paramètres éventuels):

bloc d'instructions

return résultat # pas obligatoire

Exemples :
Exemple 1 : Exemple 2 :
une fonction qui nécessite un paramètre une fonction qui ne nécessite pas de paramètre

def cube(x): def table8():


y=x**3 n=1
return y while n<=10 :
print(n,"x",8,"=",n*8)
n=n+1

2- Concepts de base sur la récurrence


2-1 : Récurrenceen mathématique

Nousallonscommencerparl'exempledelasuite numérique,(Un)définiepour ∈ ℕpar :

= ∗ +

 est appelé une suite récurrente.


= 2*(2*(. . . (2* + 3) . . .) + 3) + 3

 La conception d'une fonction récursive n'est pas éloignée du principe de démonstration par récurrence :
 Leprincipededémonstration par récurrence est le suivant:
1- On démontre d'une part que la suite satisfait une telle propriété (croissante, décroissante,....)
pour le cas de base
2- D'autre part, on suppose que cette propriété est valide pour et on démontre que cela implique
que la suite satisfait aussi cette propriété pour tout n > 0.

A.Lagrioui Page 1/8


CPGE Alcachy 2016-2017
2-2 : Définition d'algorithme récursif

Fonction récursive

Une fonction est dite récursive si elle s'appelle elle-même aucours deson exécution.

Avantagesdela récursivité

 La récursivité permetd'exprimerd'unemanière élégantelasolutiondeplusieurs problèmes:


- Récurrences mathématiquesclassiques
- Tour d'Hanoï
- Trirapide,trifusion,...
- Recherchedichotomique,...

 La récursivité est particulièrement adaptée lorsqu'elleest appliquée à unestructurerécursive.


 Leslistesetlesarbrespeuvent êtrevus commedesstructures récursives.

2-3 : Comment écrireunefonctionrécursive?

Principe
 L'idée de base pour l’écriture d'une fonction récursive consiste à
définirtoutd'abordlemodèlemathématiquedelafonctionderécurrence.
 Dans ce modèlede mathématique ilfaut déterminer la condition d'arrêtpourassurerlaterminaisonde
l'algorithme.

Exemple
Nouspouvonsdoncdéfinirlafonctionfactorielledelamanièresuivante:

1 si n=0
n!  
n * (n  1)! sinon
 n!=n*(n-1)! : Représentelarelationde récurrence.
 0!=1 : représentelavaleurdelaterminaisondel'algorithme.

Le code en Python
Méthode itérative Méthode récursive
def fact_Iter(n): Def fact_Rec(n):
F=1 ifn==0:
foriinrange(2,n+1): return1
F=F*i else:
returnF returnn* fact_Rec(n-1)
3- Les différents types de récursivité
3-1 : La récursivité simple
Définition: pour ce type de récursivité on fait un seul appel récursif pour la fonction P dans le corps d'une
fonction récursive P.
Exemple1: calcul de puissance
1 si n=0
xn   n 1
x * x sinon

A.Lagrioui Page 2/8


CPGE Alcachy 2016-2017
Questions :
1. EcrirelecodedelafonctionrécursivePuissancequiretournelavaleurde .
2. Donnerlatrace d'exécutionpourcalculer
Exemple2: calcul de puissance (version rapide)
1 si n=0
n  n / /2 n / /2
x  x * x si n pair
 n / /2 n / /2
x * x * x si n impair
Questions:
1. Ecrire le code de cette fonction récursive nommée Puiss_rapide.
2. Donner la trace d'exécution pour calculer Puissrapide(3, 5)
3-2 : La récursivité multiple
Définition:
Une récursivité est multiple s’il ya plusieurs appels récursifs à une fonction P dans le corps d'une fonction
récursive P.

0 si n=0

Exemple 1: suite de Fibonacci Fn  1 si n =1
 F +F
 n 1 n  2 si n  2
Questions:
1. Ecrire le code de la fonction récursive Fibo_Re qui retourne la valeur de .
2. Donnerlatrace d'exécutionpourcalculer
Exemple2:Calcul de combinaison
0 si p=0

Cnp  1 si n =p
 p p 1
Cn 1 +Cn 1 sinon
Questions:
1. Ecrirelecodedecettefonction récursive.
2. Donnerlatrace d'exécutionpourcalculer
3-2 : La récursivité imbriquée
Définition:
Une récursivité estdite imbriquéesiunefonction récursive P contientunappel imbriqué.
Exemple:La fonction d'ACKERMANN
 p 1 si n=0

Ack (n, p)  Ack(n-1,1) si n >0 et p=0

Ack  n-1, Ack  n, p-1  sinon

Questions:
1. Calculer a la main Ack(1,0); Ack(2,0) et Ack(3,0):

A.Lagrioui Page 3/8


CPGE Alcachy 2016-2017
2. Ecrire le code de cette fonction récursive.
3. Donner la trace d'exécution pour calculer Ack(3 , 2)
3-3 : Larécursivitémutuelle
Définition :
Une récursivité estmutuelleoucroiséequandunefonction P appelleuneautrefonction Q qui
déclencheunappel récursif à P
Remarque:
Lasituationestobligatoirementsymétrique,puisque Q déclencheraunappelde P,quidéclencherait à
sontourunappelde Q.
Exemple:Laparité d'unentiernatureln
True si n=0  False si n=0
pair (n)   et impair (n)  
impair (n  1) sinon  pair (n  1) sinon
Questions:
1. Ecrire le code de la fonction récursive pair(n);
2. Ecrire le code de la fonction récursive impair(n);
3. Donner la trace d'exécution pour calculer pair (6)
4. Donner la trace d'exécution pour calculer impair (8)

4- Exécution d'une fonction récursive :lapiledesappels


Trace d'exécution d'une fonction récursive
Principe de fonctionnement
 L'exécution d'une fonction récursive est basée sur une pile de la mémoire vive.
 La manipulation de cette zone mémoire appelée pile est similaire à la structure de données pile
traitée au cours de la première année.
 On empile les appels successifs dans une pile.(LIFO:LastInFirstOut)
Attention : ilfaut être sûrquelafonctionsetermine.
Considérons par exemple cette fonction proche de la factorielle:
=
( )=
∗ ( + ) >0
Que vaut f(4)?
Trace d'exécutionpourcalculer3!
Def fact_Rec(n):
ifn==0:
return1
else:
returnn* fact_Rec(n-1)

Phase1 :Empiler les appels

A.Lagrioui Page 4/8


CPGE Alcachy 2016-2017
PILE PILE

fact(2)=2*fact(1)
fact(3)=3*fact(2) fact(3)=3*fact(2)
- Appel de fact(3) : retourne 3*fact(2)
- Appel de fact(3) : retourne 3*fact(2)
- Appeldefact(2) : retourne2*fact(1)

PILE PILE

fact(0)= 1
fact(1)=2*fact(0) fact(1)=2*fact(0)
fact(2)=2*fact(1) fact(2)=2*fact(1)
fact(3)=3*fact(2) fact(3)=3*fact(2)
- Appel de fact(3) : retourne 3*fact(2) - Appel de fact(3) : retourne 3*fact(2)
- Appeldefact(2) : retourne2*fact(1) - Appeldefact(2) : retourne2*fact(1)
- Appel de fact(1) : retourne 3*fact(0) - Appel de fact(1) : retourne 3*fact(0)
- Appeldefact(0) : retourne 1

Phase1 : Dépiler lesappels

PILE

- Appeldefact(0):retourne1
fact(1)=1*fact(0)=1*1=1
fact(2)=2*fact(1)
fact(3)=3*fact(2)

PILE

- Appeldefact(1):retourne1
fact(1)=1*fact(0)=1*1=1
fact(2)=2*fact(1)
fact(3)=3*fact(2)

PILE

- Appeldefact(2):retourne 2

A.Lagrioui Page 5/8


CPGE Alcachy 2016-2017
fact(2)=2*fact(1) = 2*1 = 2
fact(3)=3*fact(2)

PILE

- Appel de fact(3): retourne 6

fact(3)=3*fact(2) = 3 * 2 = 6

PILE

- Pile vide

5- Comparaison de complexité d’un algorithme récursif et itératif


5-1 : Complexité d’un algorithme récursif
 La complexité d'une fonction récursive représente le coût de cette fonction, à savoir le nombre
d'opérations élémentaires qu'elle effectue ou son occupation mémoire totale.
 La notion de complexité sera présentée plus en détail dans le prochain chapitre.
 On considèrelasuite(un)suivante,quicalculeuneapproximationde√3

= ( + )

 En Python, on peut écrire la fonction récursive u qui retourne la valeur Un


def u(n):
ifn==0:
return2
else:
r=u(n-1)
return0.5*(r+3/r)
 On note C(n) le nombre d'opérations arithmétiques (addition, multiplication et division) effectuées
par la fonction u(n) (avec n : l'argument de la fonction u).

A.Lagrioui Page 6/8


CPGE Alcachy 2016-2017
 En suivant la définition de la fonction u , on obtient les deux équations suivantes:
C(0)=0
C(n)= C (n - 1)+3
 Eneffet,danslecasn=0,onnefaitaucune opération arithmétique.
 Et dans le cas n > 0, on fait d'une part un appel récursif sur la valeur n-1, d'où C(n -1)
opérations,puistrois opérations arithmétiques(unemultiplication,uneadditionetunedivision).
 Ils'agitd'unesuite arithmétiquederaison3,dontleterme généralest:
C(n)=3n
 Donc,onconclutque la complexité delafonction récursive u est O(n)

 Si en revanche on avait écrit la fonction u plus naïvement, avec deux appelsrécursifsu(n-1),c'est-à-


dire:
def u(n):
if n == 0:
return2
else:
r=u(n-1)
return 0.5*(u(n-1)+3/(u(un-1))
 Alorsles équationsdéfinissant C(n)seraientles suivantes:
C(0)=0
C(n)= C(n - 1) + C(n - 1)+3
 En effet, il convient de prendre en compte lecoûtC(n - 1) des deux appels à u(n - 1)
 Ils'agitd'unesuitearithmético-géométrique,dontleterme généralest:
C(n)=3(2n - 1)
n
 Donc, la complexité delafonction récursive u devient O(2 )

5-2 : Comparaisondecomplexité
Lacomparaisondecomplexité entreunalgorithmerécursifetunalgorithme itératifreposesurdeuxaspectsde
l'évaluation:
1- Complexité spatiale :onmesurel'espace mémoire occupé parlesvariables.
2- Complexité temporelle :onmesurelenombre d'opérations.
Complexité spatiale(CS)
 La taille mémoire occupée par une fonction itérative est inférieure à celle utilisée par une fonction
récursive, en raison des appels successifs dans une cette dernière.
 Exemple:
CS(fact_Iter )= O(1)
CS(fact_Rec)= O(n)

CS(fact_Iter )<CS(fact_Rec)
Complexité temporelle(CT)

A.Lagrioui Page 7/8


CPGE Alcachy 2016-2017
 La même remarque pourla complexité temporelle,eneffet le coûtd'exécution d'unefonction
itérativeest généralementinferieureautemps d’exécutiond'unefonction récursivepourle même
problème.
 Exemple:
CT(Fibo_Iter )= O(n)
CT(Fibo_Rec)= O(2n)

CT(Fibo_Iter )< CT(Fibo_Rec)


5-3 : Limitationde la récursivité enPython
 LelangagePythonlimite,arbitrairement,lenombred'appels imbriqués à 1000 appels.
 Unefonctionquifaitplusde1000appels récursifsprovoqueuneerreur.
 Exemple:
>>>deffact(n):
ifn==0:
return1
else:
returnn*fact(n-1)
>>>fact(1005)
RuntimeError: maximum recursiondepthexceeded in comparison
 Ilexistedenombreusessituations où l'onsaitquelenombred'appelsserabien inférieur à 1000.

A.Lagrioui Page 8/8

Vous aimerez peut-être aussi