Sunteți pe pagina 1din 16

Tehnici de programare

RECURSIA

Mecanismul general

Recursia - un proces care se realizeaz prin


apelarea unei forme mai simple ale sale.

Regula de consisten
Exist unul sau cteva cazuri elementare, la

apariia crora procesul recursiv este oprit.


Procesul recursiv converge obligatoriu spre
un caz elementar.

Descriere
Fie P o problem n care cere calculul valorii v,
v Q = {Q0, Q1, Q2, ..., Qk, ... Qn, ...}

Q0, este cunoscut, sau poate fi calculat direct.


Oricare Qi Q poate fi exprimat prin elementul
Qi-1 i o expresie calculabil.

Soluia recursiv

Se determin formula de calcul a elementului Qi


exprimat prin Qi-1 .
Se exprim consecutiv
Qi prin Qi-1
Qi-1 prin Qi-2
...

Q1 prin Q0
Se calculeaz (dac e necesar) Q0
Se calculeaz
Q1 folosind Q0
Q2 folosind Q1
...
Qn-1 folosind Qn-2

Subprograme recursive

Subprogram recursiv un subprogram


care n procesul realizrii se autoapeleaz.

Apelurile repetate se realizeaz cu valori


ale parametrilor, care asigur convergena
ctre un caz elementar.

Un apel se consider realizat numai dup


primirea rezultatelor de la apelul subordonat
i efectuarea calculelor directe.

34

nk = n*nk-1

81

34 = 3 * 33
3 =3*3
3

3 =3*3
2

3 =3*3
1

30 = 1

n k
3 4

n0 = 1.
27

n k
3 3

n k
3 2

n k
3 1

n k
3 0

Subiectul Nr 6, Problema 12
Fie date dou numere a i n, a R, n Z, |a|
<100, |n|<10. Scriei un program, care calculeaz recursiv an.
Intrare: numerele a i n se citesc de la
tastatur.
Ieire: valoarea calculat se nscrie n fiierul
text OUT.TXT.

Analiza problemei
Exist un caz elementar:

a0 = 1

Este cunoscut formula de reducere a ordinului


problemei:

M
o
d
e
l
u
l
m
a
t
e
m
a
t
i
c

n>0

n<0

an

n<0
a, n
a, n+1

Apel
1
Apel
2

a, -1
a, 0

a, n
a, n-1

...

...
a, -2

n>0

Apel |n| 2
Apel |n| 1
Apel |n|

a, 2
a, 1
a, 0

Declaraii

Program Recursie1;
Varn: integer;
a: real;
f: text;

Funcii
function putere
(x: real; y:integer): real;
begin
if y=0 then putere:=1
else
if y<0 then putere:=
putere(x,y+1)/x
else putere:=
putere(x,y-1)*x;
end;

Blocul de calcul
Begin
assign(f, out.txt);
rewrite(f);
readln(a,n);
writeln(f, putere(a,n));
close(f);
end.

Generalizri
Fie P o problem n care cere calculul valorii v,
v Q = {Q1, Q2, ..., Qk, ... Qn, ...}

Q1, Q2, ..., Qk snt cunoscute, sau pot fi calculate


direct.
Oricare Qi Q poate fi exprimat prin elementele
Qi-1, Qi-2 , ... , Qi-k.

Soluia recursiv

Se determin formula de calcul a elementului Qi


exprimat prin Qi-1, Qi-2 , ... , Qi-k .
Se exprim Qi prin Qi-1, Qi-2 ,... , Qi-k
Qi-1 prin Qi-2, Qi-3 ,... , Qi-(k+1)
...
Qk+1 prin Qk, Qk-1 ,... , Q1
Se calculeaz (dac e necesar) Qk, Qk-1 ,... , Q1
Se calculeaz Qk+1 folosind Qk, Qk-1 ,... , Q1
Qk+2 folosind Qk+1, Qk ,... , Q2
...
Qi folosind Qi-1, Qi-2 ,... , Qi-k