Documente Academic
Documente Profesional
Documente Cultură
Ce este recursivitatea?
Recursivitatea este una dintre noțiunile
fundamentale ale informaticii. Ea a fost
introdusă în programare în 1960, în
limbajul Algol și din necesitatea de a
transcrie direct formulele matematice
recursive. Noțiunea de recursivitate din
programare derivă în mod natural din
noțiunea de matematică cunoscută sub
numele de recurență.
Funcția Ackermann:
n 1, daca m 0
ack ( m, n) ack (m 1,1), daca n 0
ack (m 1, ack ( m, n 1)), daca m 0, n 0
Care sunt regulile pentru scrierea corectă a
subprogramelor recursive?
Orice funcție recursivă trebuie să se execute măcar o
singură dată fără a se autoapela;
Toate autoapelurile să se execute astfel, încît să se
tindă spre condiția de îndeplinire fără autoapelare;
Să se respecte regula de consistență:
Soluția trebuie să fie direct calculabilă ori calculabilă
cu ajutorul unei valori direct calculabile.
Orice funcție recursivă trebuie să conțină cel puțin o
instrucțiune if prin care se verifică dacă mai este
necesar un apel recursiv sau se iese din funcție.
Care sunt avantajele și dezavantajele recursiei?
Avantajul:
Scrierea mai compactă și mai clară a
funcțiilor
Dezavantajele:
Sunt mai greu de urmărit;
Necesită un timp de execuție mai lung;
Necesită un spațiu de memorare mai
mare.
Ce este iterația?
În funcție de modul de implimentare, un algoritm poate fi:
Recursiv;
Iterativ
La apelurile recursive spațiul ocupat de memorie crește rapid și
din acest motiv recursia se înlocuiește cu iterație. Ea este
preferată uneori din cauza vitezei mai mari de execuție și
memoriei mai reduse. Iterația utilizează instrucțiunile for,
while, repeat.
1.Mic 1. Mare
2.Complicată 2. Simplă
Același
3. Mare 3. Mic
4. Simplă 4. Complicată
Deosebiri: Asemănări:
1.Necesarul de memorie 1.Timpul de execuție
2.Structura programului
3.Volumul de muncă necesar pentru scrierea
programului
4.Testarea și depănarea programelor
Exemplu de rezolvare
Problemă: Definiți algoritmul și scrieți un program pentru calculul funcției
șirului Fibonacci 1,1,2,3,5,8,13,21... într-o manieră recursivă și nerecursivă.
Rezolvare:
Problema șirului Fibonacci poate fi descrisă prin formula de recurență:
0, daca n 0
fib( n) 1, daca n 1
fib( n 2) fib( n 1), daca n 1
deosebim:
1. Cazul elementar n=0 sau n=1. În acest caz valoarea fib(o) și fib(1) este
direct calculabilă și anume fact(0)=0 și fib(1)=1;
2. Cazuri neelementare n>1. În astel de cazuri valorile fib(n) nu sunt direct
calculabile, însă procesul de calcul progresează către cazul elementar
fib(o)sau fib(1).
0, daca n 0
fib(n) 1, daca n 1
fib(n 2) fib(n 1), daca n 1
+
fib:=fib(4);
f(3) 2 1 f(2) en
fib:=fib(4);
end.
f(2) 1 + 1 1 + 0
f(1) f(1) f(0)
1
f(1)
+ 0
f(0)
f(1) f(0)
Varianta nerecursivă a șirului Fibonacci
Program Fibonacci_nerecursiv;
Var i,n:integer;
Fib:array [1..15] of integer;
Begin
Writeln ('Introdu numărul n=';); readln (n);
fib[1]:=1;
fib[2]:=1;
for i:=3 to n do
fib[i]:= fib[i-2]+ fib[i-1];
for i:=1 to n do
Writeln (fib [i]);
end.
Recursia/Iterația
Sarcini practice individuale
Fie dat programul de mai jos:
Program Recursiv;
Var a,b:integer;
Function CMMDC (a,b:integer)integer;
Begin
If a=b then CMMDC:=a else
If a>b then CMMDC:=CMMDC (a-b,b)
Else CMMDC:=CMMDC (a, b-a) End;
Begin
write('a='); readln(a);
write('b='); readln(b);
writeln('cmmdc=' ,cmmdc(a,b));
readln; end.