Sunteți pe pagina 1din 17

Tema:RECURSIA

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ță.

Recursia se defineşte ca o situaţie, în care un subprogram se autoapelează,


fie direct, fie prin intermediul altei funcţii sau proceduri.

Subprogramul care se autoapelează se numeşte recursiv.


Tipuri de recursivitate
Din punct de vedere al modului în care se realizează
autoapelul, există două tipuri de recursivitate:
1. Directă – cînd funcția conține un apel direct la ea
însăși;
2. Indirectă (mutuală) – se realizează prin intermediul
mai multor funcții care se apelează circular (două
subprograme A și B sunt indirect recursive, dacă se
apelează reciproc)
Exemple de funcții matematice recursive
Funcția factorial:
1, daca n  0
fact (n)  
n * fact (n  1), daca n  0
Funcția Fibonacci:
0, daca n  0

fib( n)  1, daca n  1
 fib( n  2)  fib( n  1), daca n  1

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.

Iterația este execuția repetată a unei porțiuni de program


pînă la îndeplinirea unei condiții.
Relația dintre recursivitate și iterație
Iterativitate Recursivitate

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

De exemplu, pentru n=4, obținem:


fib(4)  fib(4  2)  fib(4  1)  fib(2)  fib(3)
fib(3)  fib(3  2)  fib(3  1)  fib(1)  fib(2)
fib(2)  fib(2  2)  fib(2  1)  fib(0)  fib(1)
fib(1)  1; fib(0)  0
fib(2)  0  1  1
fib(3)  1  1  2
fib(4)  1  2  3
Răspuns: fib(4)=3
Varianta recursivă a șirului Fibonacci
Var fib:Integer;
4
0
2
3
1 3 function fib(n:Integer):Integer;
begin
if n=0 then fib:=0 else
if n=1
n=0 then fibo:=1 else
fibo:=0else
fib:=0
f(4) 3 if n=1 then fib:=1
fibo:=1else
else
fibo:=fibo(n-1)+fibo(n-2);
end;
fib:=fib(n-1)+fib(n-2);
fibo:=fibo(n-1)+fibo(n-2);
end;
begin
fib:=fib(n-1)+fib(n-2);

+
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.

Ce va afişa programul pentru a=3 și b=7?


Fie dată funcția:
Function Test(x:integer):integer;
begin
If x=0 then Test:=1
else if x=1 then Test:=Test(x+1)
else Test:=Test(x+2)+x;
end;
Ce valoare va avea funcţia pentru x=3?
Fie dată funcția Factorial:

Function Fact (n:integer):integer;


begin
If n=0 then Fact :=1
else Fact:=n* Fact (n-1)
end;

Ce valoare va avea funcţia pentru n=8?


Sarcini practice individuale
1. Elaborați un program cu funcție recursivă cu numele cifre care
primeste prin parametrul n un număr natual și furnizează:
- prin parametrul p numărul format cu cifrele pare ale lui n,
- prin parametrul i numarul format cu cifrele impare ale lui n.
Exemplu: În urma apelului cifrelor (4536597,p,i); variabila p va fi
egala cu 46, iar i cu 53597.

2. Se citește un numaăr natural n cu cel mult 9 cifre. Afișați numărul


de cifre distincte ale lui n. Se vor folosi exclusiv subprograme
recursive.
Exemplu: Pentru n=38837 se afiseaza 3 (cifrele distinte sunt 3,7 si 8).

3. Să se elaboreze un program cu o funcție recursivă care primește un


parametru n număr natural și returnează numărul obținut din n prin
eliminarea cifrelor pare.

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