Sunteți pe pagina 1din 6

Recursivitate

Def. Enun recursiv daca, pentru a se defini, se autoapeleaz. Observaie foarte important: pentru un enun recursiv trebuie s existe o condiie de ieire. Problemele care nu sunt rezolvate recursiv au rezolvarea iterativ. (Iterativ) Exemple: 1. irul Fibonacci f(n)= 0 dac n=1 1 dac n=2 f(n-1) + f(n+2) dac n>2 Iterativ: Int f1, f2, f3; F1=0; f2=1; For(i=3;i<=n;i++) { F3=f1+f2; F1=f2; F2=f3; } F(7) folosesc valorile determinate deja pentru f(6) si f(5) Recursiv: Int fibo(int i) { If(n==1) Return 0; Else If(n==2) Return 1; Else Return fibo(n-1) + fibo(n-2)

} F(7) f(6) F(5) f(5) F(4) f(4)

F(3) Primul rezultat f(5) nu il folosesc pentru apelul urmtor f(5). 2. Cel mai mare divizor comun - algoritmul prin diferen Cmmdc(a,b) = a daca a=b Cmmdc(a-b,b) dac a>b Cmmdc(a,b-a) dac a<b Ex: Cmmdc(65,26) = cmmdc (39 26) = cmmdc(13,26) = cmmdc(13,13) 13 - algoritmul lui Euclid Euclid(a,b) = b dac a%b=0 Euclid (b, a%b) rest 3. Puterea a Putere (x) = 1 daca x=0 Putere(x-1)*a daca x>0 4. Factorialul n! = 1*2*3* *n = (1*2*3* * (n-1))*n Fact(n) = 1 dac n=0 Fact(n-1)*n daca n>0

5.

Orice structur repetitiv poate fi transcris folosind recursivitatea. For(i=1;i<=n;i++) Secven de instruciuni
-

etapa de iniializare: i=1 (verific condiia i<=n) => execut secvena etapa de reiniializare: i = i+1 (verific conditia i<=n) => execut secvena

For(i) = nimic dac i>n For(i+1) cu execuia secvenei dac i<=n Exercitiu: void f(long n, int i) { if(n==0) cout<<i; if(n%3>0) f(n/3, i+1); } f(121, 1) -> f(40, 2) -> f(13, 3) -> f(4,4) -> f(1,5) -> f(0,6) afis 6! <<<<<Functii importante pt numere!!!!!!!!!!! - x este fibonacci? int fibo(int x, int f1, int f2,) { int f3=f1+f2; if(f3==x) return 1; else if(f3<x)

return fibo(f2, f3, x); else return 0; } fibo(x, 0, 1); - x este prim int prim(int x, int d) { if(x<=1) return 0; if(d*d<=x) if(x%d==0) return 0; else return prim(x,d+1); else return 1; } - nr divizori int nr_div(int x, int d) { if(x==1) return 1; else if(d<=x/2) if(x%d==0) return 1+nr_div(x,d+1); else return nr_div(x,d+1); else return 2; // pentru 1 si x } apel: (x, 2);

- cmmdc int cmmdc_r(int a, int b) { if(a==b) return a; else if(a>b) return cmmdc_r(a-b,b); else return cmmdc_r(a,b-a); } - suma cifrelor int suma_c(int x) { if(x!=0) return x%10+suma_c(x/10); else return 0; } - nr palindrom int palindrom(int x, int y, int pal) { if(y!=0) return palindrom(x, y/10, pal*10+y%10); else if(pal==x) return 1; apel: palindrom(x, x, 0); } - nr perfect int perfect(int x, int d, int s) { if(x==1) return 0;

else if(d<=x/2) if(x%d==0) return perfect(x, d+1, s+d); else return perfect(x, d+1, s); else if(s==x) return 1; else return 0; } apel: perfect(x, 1, 0); citire, afis, ordonare. . .

S-ar putea să vă placă și