Professional Documents
Culture Documents
Drcursivation (suite)
Rcursivit terminale
Drcursivation
ALGORITHM P(U)
Begin
if C(U) then D(U);P((U))
else T(U)
End
U est la liste des paramtres ;
C(U) est une condition portant sur U ;
D(U) est le traitement de base de lalgorithme
(U) reprsente la transformation des
paramtres
T(U) est le traitement de terminaison
medbecha 2010
Drcursivation (suite)
Version rcursive
DIVIDE (a , b)
Begin
if a = 0 then Error
else if a b then return a
=b
else
return DIVIDE(a , b-a)
End
Version drucrsive
DIVIDE (a , b)
Begin
if a = 0 then Error
while( b > a) do
b= b-a
return (a=b)
End
medbecha 2010
Drcursivation (suite)
Version rcursive
Drcursivation
Factorial (n)
Begin
if n = 0 then
return 1
else
return
NFactorial(n-1)
End
Factorial (n)
Begin
F=1
for i = n step -1 to 1 do
F = F*i
End
medbecha 2010
Drcursivation (suite)
Dfinition : Rcursivit non terminale : La rcursivit
est dite non terminale si et seulement si lappel rcursif
est suivi dun traitement. Cela implique quil reste un
traitement reprendre ultrieurement.
Pour drcursiver une rcursivit non terminale, il va
falloir sauvegarder, sur une pile, le contexte de lappel
rcursif, typiquement les paramtres de lappel
engendrant lappel rcursif.
medbecha 2010
Drcursivation (suite)
Rcursivit non terminale
Drcursivation
ALGORITHM Q(U)
Begin
if C(U) then
D(U);Q((U));F(U)
else T(U)
End
ALGORITHM Q(U)
Begin
Stack.init()
while C(U) do
D(U)
Stack.push(U)
U = (U)
T(U)
while not Stack.empty() do
Stack.pop(U)
F(U)
End
medbecha 2010
Drcursivation (suite)
Drcursivation (suite)
Version rcursive
Drcursivation
Foo (n)
Begin
if n > 0 then
display(\n IN n=+n+\n)
Foo(n-1)
display(\n OUT n=+n+\n)
else
display(\n Terminated \n)
End
Foo (n)
Begin
Stack.init()
while n>0 do
display(\n IN n=+n+\n)
Stack.push(n)
n = n-1
display(\n Terminated \n)
while not Stack.empty() do
Stack.pop(n)
display(\n OUT n=+n+\n)
End
medbecha 2010
Drcursivation (suite)
Remarques :
Les programmes itratifs sont souvent plus efficaces, mais
les programmes rcursifs sont plus faciles crire.
Les compilateurs savent, la plupart du temps, reconnatre
les appels rcursifs terminaux, et ceux-ci nengendrent pas
de surcot par rapport la version itrative du mme
programme.
Il est toujours possible de drcursiver un algorithme
rcursif.
medbecha 2010
t
u
c
d
Chacune de ces quatre oprations correspond deux multiplications de matrices carrs de taille
n/2 et une addition de telles matrices. partir de ces quations on peut aisment driver un
algorithme diviser pour rgner dont la complexit est donne par la rcurrence :
T (n) 8T ( n ) (n 2 )
2
T ( n)
aT ( n ) D(n) C (n) si non
medbecha 2010
n
b
medbecha 2010
medbecha 2010
T(n) = 9 T(n/3) + n
Ici a = 9, b = 3, c = k = 1.
a = 9 > bk = 31
Donc on applique le cas 1 du
thorme 2 :
T(n) = (nlog39) = (n2)
T(n) = T(2n/3) + 1
Ici a = 1, b = 3/2, c = 1 et k = 0
a = 1 = bk = (3/2)0 = 1
Donc on applique le cas 2 du
thorme 2 :
T(n) = (n0log2n) = (log2n)
medbecha 2010
Exemples :
1) Soit :
tn - 3 tn-1 - 4 tn-2 = 0
(forme gnrale)
t 0 = 0 , t1 = 1
(conditions initiales)
son quation caractristique est : x2 3x 4 = 0
2 racines distinctes : r1 = -1 et r2 = 4
donc la solution gnrale est : tn = C1(-1)n + C2 4n (4n)
en appliquant les conditions initiales on trouve C1=1/5 et C2=1/5
2) Soit :
tn - 5 tn-1+ 8 tn-2 - 4 tn-3 = 0 (forme gnrale)
t0 = 0 , t1 = 1 , t2 = 2 (conditions initiales)
son quation caractristique est : x3 5 x2 + 8 x 4 = 0 ou alors : (x-1)(x-2)2 = 0
3 racines : 1, 2 et 2 (2 est une solution multiple de multiplicit = 2)
donc la solution gnrale est : tn = C11n + C22n + C3n2n (2n)
les conditions initiales donnent : C1 = 2, C2 = 2 et C3 =
medbecha 2010
rcurrence :
T ( n)
2T ( n ) (n) si non
Conclusion
Il existe plusieurs solutions algorithmique un mme
problme (ou classe de problmes).
Le but de lalgorithmique cest de trouver une
solution optimale chaque classe de problmes
considrs.
Lalgorithmique propose des outils pour atteindre ce
but: lanalyse de la complexit, la drcusivation, et
le paradigme diviser pour rgner
medbecha 2010
Type
n=20
n=50
(1)
Constante
10ns
10ns
10ns
10ns
10ns
Accs tableaux
(log(n))
logarithmique
10ns
20ns
30ns
40ns
60ns
Dichotomie
(n)
linaire
100s 10ms
Parcours de liste
(nlog(n))
quasi-linaire
260ns 850ns 6s
400s 60ms
Tri Fusion
(n2)
quadratique
4s
25s
625s 1s
2h48
(n3)
Cubique
80ms
1.25ms
156ms
2h42
316ans
(nlog(n))
quasi-polyno.
492ns 7s
5ms
3.2ans
1020ans
(en)
Exponentielle
10ms
130j
1059ans
Fact. premiers
(n!)
Factorielle
770ans
1048ans
Voyag. Commer.
medbecha 2010
Tri insertion
Annexe 2: Illustration
Problme : la plus grande somme contigu
Le but est dlaborer un algorithme permettant de calculer
la plus grande somme contigu dentiers placs dans un
tableau.
tant donn un tableau A[0..n-1] de n nombres entiers
positifs ou ngatifs, comment dterminer la valeur
maximale des sommes correspondantes aux sections de la
forme A[i..j[ ??
On notera que 0 est la somme de nimporte quelle section
vide A[i..i[
medbecha 2010
medbecha 2010
Complexit en (n3) !
medbecha 2010
a a
k i
k i
a j 1
Do le nouveau programme
en (n2) :
medbecha 2010
for i= m +1 to r do
sum = sum + A[i];
if(sum> max_2) then
max_2 = sum;
maximum = max1 + max2;
sum = PGSC_3(A,l,m);
if(sum>maximum) then
maximum = sum;
sum = PGSC_3(A,m+1,r);
if(sum>maximum) then
maximum = somme;
return maximum;
END
medbecha 2010