50 likes | 232 Views
Recursivitate. Burdea David si Catalin Negulescu. Definita procesului de recursivitate. Recursivitatea reprezinta o tehnica de programare de o importanta deosebita. Ea permite o exprimare extrem de concisa si clara a algoritmilor de rezolvare a unor probleme complexe.
E N D
Recursivitate Burdea David siCatalinNegulescu Burdea David si Catalin Negulescu
Definitaprocesului de recursivitate • Recursivitatea reprezinta o tehnica de programare de o importanta deosebita. Ea permite o exprimare extrem de concisa si clara a algoritmilor de rezolvare a unor probleme complexe. • Un subprogram este recursiv daca se autoapeleaza pe el insusi . Burdea David si Catalin Negulescu
Observatii • 1) Orice f recursivatrebuiesacontina o conditie de oprire,respectiv de continuare. • 2)la fiecareapel al f. se executaaceasisecventa de instructiuni. • 3)tinandseama de observatiaanterioarapentru a scrie un program recursivproblematrebuiesacontina o functie care sacontinarelatia de recurenta • 4)la fiecareapel in zona de stiva a memoriei se creeaza un nivelsaupestiva se memoreazavalparametrilorformalitransmisiprinvaloare, adresaparam. formalitransmisiprinreferinta, adresa de revenire, variabilele locale cu val din mom respectiv. • 5)toateinstructiunile din subprogram se executapentrufiecarereapel. Burdea David si Catalin Negulescu
Limbajul C/C++ • for(i=1;i<=n;i++) {secventa de operatii} while(cond_logica) {secventa de operatii} Burdea David si Catalin Negulescu
unsigned fib(unsigned n) { if (n <= 1) return 1; else return fib(n-1)+fib(n-2); } Unsigned fib_smart(unsigned n) { unsigned f2 = 1, f1 = 1, f; if (n <= 1) return 1; while (--n) { f = f1 + f2; f2 = f1; f1 = f; } return f; } unsigned fib_nonrec(unsigned n) { inti, *f, res; if (n <= 1) return 1; f = malloc(n * sizeof(int)); f[1] = f[0] = 1; for (i = 2; i < n; i++) f[i] = f[i-1] + f[i-2]; res = f[n-1] + f[n-2]; free(f); return res; } • Atentie! Traducereadirectaa formuleirezultaınapeluriredundante!(se apeleazadin nou fib(n-2) siın fib(n-1), etc.) • ⇒nr. de apeluri (catept. fib(5)?) e exponential ın n (f. ineficient) Burdea David si Catalin Negulescu