Documente Academic
Documente Profesional
Documente Cultură
Algoritmi iterativi
Algoritmi recursivi
Recursivitate simplă (algoritmi uni-recursivi)
Recursivitate multiplă (algoritmi multi-recursivi)
Exemple
Numărarea valorilor care îndeplinesc o condiție
Suma elementelor unui masiv
Algoritmul lui Euclid
Calcularea elementelor șirului Fibonacci (și multe altele)
Recursivitate, funcții recursive
Implicații
Construire funcții
Cerințe de memorie
Recursivitate, funcții recursive
apelator
fact(3) t1
Memorie ocupată
fact(3)
3*fact(2) t2
fact(2)
Stack 2 * fact(1) t3
Return address
t1 3 t8 fact(1)
f 1 * fact(0) t4
Return address
t2 2 t7
f fact(0)
Return address 1
t3 1 t6
f 1*1=1 t5
Return address
t4 0 t5
f 2*1=2 t6
3*2=6 t7
6 t8
Recursivitate, funcții recursive
fib( 4 )
fib( 1 )
fib( 3 )
fib( 2 ) 1
fib( 0 )
fib( 1 )
1
1 2
fib( 0 )
6
1
2
fib( 1 )
1
3
fib( 2 )
Recursivitate, funcții recursive
▪ Consum de memorie
▪ Timp de procesare
Căutare binară
int bisectie( float x1, float x2, float eps, int n, float (*f)
Metoda bisecției
(float), float *x)
{ int
int cod;
bisectie( float x1, float x2, float eps, int n,
if ( n == 0 ) float (*f)(float), float *x)
{ cod
int =cod
0; = 0;
else
while
{ *x = (x1((n > 0)
+ x2) && (cod == 0))
/ 2;
{ *x = (x1 ==
if((*f)(*x) + 0)
x2) / 2;
if((*f)(*x)
cod = 1; == 0)
else cod = 1;
else
if((x2-x1) < eps)
if((x2-x1) < eps)
cod cod
= 2;= 2;
elseelse
{ if( if((*f)(x1)*(*f)(*x)<0)
(*f)(x1) * (*f)(*x) < 0 )
x2 =x2*x;
= *x;
elseelse
x1 =x1*x;
= *x;
n--;
n--;
} cod = bisectie( x1, x2, eps, n, f, x );
return
}
cod; if((*f)(x1)*(*f)(*x)<0)
} cod = bisectie( x1, *x, eps, n-1, f, x );
return cod;
} else cod = bisectie( *x, x2, eps, n-1, f, x );
Recursivitate, funcții recursive