Académique Documents
Professionnel Documents
Culture Documents
I – Fonction récursive
{
n !=n×(n−1) ! si n>1
1 !=1 si n=1
Ce qui donne une fonction récursive fact(n) (codé ici en Python) :
fact(n) :
if n == 1 : cas de base
return 1
else :
return n*fact(n-1) appel récursif
fact(4) = 4 * fact(3)
3 * fact(2)
2 * fact(1)
On peut également avoir des fonctions avec plusieurs appels récursifs, comme la suite de Fibonacci
(double récursivité), avec n ≥ 0 :
{
fibo(n)=fibo(n−1)+ fibo(n−2) si n>1
fibo(1)=1 si n=1
fibo(0)=0 si n=0
1
II – Diviser pour régner
Diviser pour régner (Divide and Conquer) est une technique algorithmique consistant à :
Cette technique fournit des algorithmes efficaces pour de nombreux problèmes, comme la recherche
d'un élément dans un tableau trié (recherche dichotomique), le tri (tri fusion, tri rapide), la
multiplication de grands nombres (algorithme de Karatsuba) ou l’exponentiation rapide.
2
III – Exemples de récursivité
def maximum(L,m):
if L == []:
return m
else
if L[0] > m:
return maximum(L[1:],L[0])
else:
return maximum(L[1:],m)
B] Tri fusion
Le tri fusion est un algorithme de type Diviser pour Régner :
1 – Diviser : on divise notre tableau en tableaux 2 fois plus petits ;
2 – Régner : on trie chacun des tableaux récursivement ;
3 – Fusion : on fusionne les tableaux triés obtenus par récursivité.
def tri_fusion(L):
if len(L) == 1:
return L
else:
m = len(L)//2
Lg = tri_fusion(L[:m])
Ld = tri_fusion(L[m:])
return fusion(Lg,Ld)
def fusion(L1,L2):
R = []
while L1 != [] and L2 != [] :
if L1[0] < L2[0]: # L.pop(0) renvoie le
R.append(L1.pop(0)) # premier élément de L
else: # et le supprime
R.append(L2.pop(0))
R += L1 + L2 # on concatène à R
return R # L1 et L2 (l’une des
# deux étant vide)