Chap5 Récursivité
Chap5 Récursivité
Chap5 Récursivité
CHAPITRE V: LA RECURSIVITE
1. Définition
Un algorithme est dit récursif s'il est défini en fonction de lui-même. La récursivité est un
principe puissant permettant de définir une entité à l'aide d'une partie de celle-ci. Alors,
chaque appel successif travaille sur un ensemble d'entrées toujours plus affinée, en se
rapprochant de plus en plus de la solution d'un problème.
Prenons un exemple classique : le calcul de la factorielle.
Solution récursive :
Solution itérative : n! = ∏
{
( )
def Fact(n) : def Fact_rec(n) :
f=1 if n==0 :
for i in range(1,n+1): return 1
f=f*i else :
return(f) return(n*Fact_rec(n-1))
def Combinaisons(n,p) :
if p==0 or p==n:
return(1)
else :
return(Combinaisons(n-1,p)+ Combinaisons(n-1,p-1))
( ) { ( )
( ( ))
def Ackermann(m,n) :
if m==0 :
return(n+1)
if n==0 :
return(Ackermann(m-1,1))
return(Ackermann(m-1, Ackermann(m,n-1)))
>>> Ackermann(3,4)
125
Suite arithmétique :
( ) { ( ) ( )
( )
Suite arithmético-géométrique :
( ) { ( ) ( ( ) )+r
( )
𝑏
Tel que : 𝑟
𝑎
Relation de récurrence de forme :
( ) ( ) ( ) ( )
( )
o Si ( ) ( )
o Si ( ) ( ( ))
o Si ( ) ( ( )) ( )
On explique ici comment calculer le coût d’une fonction récursive, à savoir le nombre
d’opérations élémentaires qu’elle effectue.
def u(n):
if n == 0:
return 2.
else:
x = u(n-1)
return 0.5 * (x + 3. / x)
( ) {
( ) ( )
En effet, il convient de prendre en compte le coût T(n − 1) des deux appels à u(n-1). Il s’agit
maintenant d’une suite arithmético-géométrique, dont le terme général est :
( ) ( ( ) )+r Avec : , a= 2 , b= 4 et T(0)=1
Alors :
( ) ( ( )) + (-4) = 5*2n - 4
Il s’agit donc, d’une complexité exponentielle : O(2n).
TD Chapitre VI : La Récursivité
Exercice n°1 :
Soient x et n∈N. On peut définir xn par récurrence à partir des relations: x0 = 1 et xn = x * xn-1 si x > 1.
Ecrire une fonction en Python Puissance(x,n) qui calcule xn selon le principe présenté ci-dessus.
Déterminer le type de récursivité de cette fonction.
Exercice n°2:
Ecrire une fonction récursive en Python Somme_Chiffre(N) permettant de calculer la somme des
chiffres d'un entier positif passé en paramètre. Donner la version itérative et comparer l'efficacité.
Exercice n°3 :
Ecrire une fonction récursive en Python Palindrome(ch) qui vérifie si une chaîne de caractère est un
palindrôme ou non.
Rappel : un palindrôme est un mot qui se lit de la même façon de gauche à droite et de droite à gauche.
Exemple Maram, SOS
Exercice n°4 :
Ecrire une fonction récursive Renverse(L) qui réarrange les éléments d’une liste en ordre inverse.
Exercice n°5 :
Soit la fonction Test(L, k) où L est une liste d'entiers non vide et k vérifiant 0 ≤ k < len(L).
def Test ( L , k ) :
if k == len ( L ) - 1 :
return True
else:
if L [ k ] > L[ k+1] :
return False
else:
return Test ( L , k+1)
1) Soit L = [6, 9, 4, 8, 12]
a. Que retourne Test(L, 2) (Donner la liste des appels récursifs) ?
b. Que retourne Test(L, 0) (Donner la liste des appels récursifs) ?
2) Que fait la fonction Test dans le cas général ?
3) Calculer le cout et déduire la complexité de cette fonction.
Exercice n°6 :
On considère la suite définie par :
1. Ecrire une fonction itérative, intitulée U_iter, qui prend comme paramètre un entier naturel n
et calcule le terme Un de la suite.
2. Ecrire une fonction récursive, intitulée U_rec, qui prend comme paramètre un entier naturel n
et calcule le terme Un de la suite.
3. Calculer le coût des deux fonctions précédentes en déduisant leur complexité puis comparer
leur efficacité.