17.04.2013 Views

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

Florian Moraru PROGRAMAREA CALCULATOARELOR în limbajul C

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

if (n>0)<br />

return n*fact(n-1); // n!=n*(n-1)!<br />

else<br />

return 1; // 0! = 1<br />

}<br />

Functiile recursive cu mai multe apeluri sau cu un apel care nu este ultima<br />

instructiune pot fi rescrise iterativ numai prin folosirea unei stive. Aceastã stivã poate<br />

fi un simplu vector local functiei. Exemplu:<br />

void binar ( int n) { // afisare in binar<br />

int c[16],i; // c este stiva de cifre<br />

// pune resturi in stiva c<br />

i=0;<br />

while ( n>0) {<br />

c[i++]=n%2;<br />

n=n/2;<br />

}<br />

// descarca stiva: scrie vector in ordine inversa<br />

while (i>0)<br />

printf ("%d",c[--i]);<br />

}<br />

Exemplul urmãtor este o functie recursivã cu argument vector :<br />

double max2 (double a, double b) { // maxim dintre doua valori<br />

return a > b ? a:b;<br />

}<br />

double maxim (double a[ ], int n) { // maxim dintr-un vector<br />

if (n==1)<br />

return a[0];<br />

else<br />

return max2 (maxim (a,n-1),a[n-1]);<br />

}<br />

Fiecare apel recursiv are parametri diferiti, sau mãcar o parte din parametri se<br />

modificã de la un apel la altul.<br />

Varianta recursivã a unor functii poate necesita un parametru <strong>în</strong> plus fatã de<br />

varianta nerecursivã pentru aceeasi functie, dar diferenta se poate elimina printr-o altã<br />

functie. Exemplul urmãtor este o functie recursivã de cãutare binarã <strong>în</strong>tr-un vector<br />

ordonat, care reduce succesiv portiunea din vector <strong>în</strong> care se cautã, portiune definitã<br />

prin doi indici <strong>în</strong>tregi.<br />

// cauta b <strong>în</strong>tre a[i] si a[j]<br />

int cautb (int b, int a[], int i, int j) {<br />

int m; // indice median intre i si j<br />

if ( i > j) // daca indice inferior mai mare ca indice superior

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!