Documente Academic
Documente Profesional
Documente Cultură
?
Subprograme (continuare sem. 1)
Recursivitate
Studiu individual
Funcții cu număr variabil de parametri
Semnificație
Adresa din memorie unde se află codul executabil al funcției
Tip de dată
pointer către o funcție care primește o anumită listă de parametri și
întoarce a un anumit rezultat
Utilizare
Apelul dinamic al subprogramelor, transmiterea funcțiilor ca parametri
către alte funcții
Pointeri la funcții (subprograme)
Exemple
void main()
{ int dim; float a[100]; int unde[100], cite;
void (*p)(float [], int );
float (*q)(float [], int , int [], int* );
//…
p = sortare;
q = minim;
sortare(a,dim); // (*p)(a, dim); p(a, dim);
minim(a,dim,unde,&cite); // (*q)(a,dim,unde,&cite);
//…
}
Pointeri la funcții (subprograme)
Exemplu
Metoda bisecției pentru rezolvarea unei ecuații
f(x)
n, eps
x1 x x2
Pointeri la funcții (subprograme)
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
Metoda bisecției
(*f)(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 =cod0; = 0;
else
while
{ *x = (x1((n > 0)
+ x2) && (cod == 0))
/ 2;
{ *x = (x1 ==
if((*f)(*x) + x2)
0) / 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