Sunteți pe pagina 1din 6

LUCRAREA nr.

ALGORITMI RECURSIVI

A. Considera ii teoretice

Numim program recursiv un program care con ine cel putin un


subprogram recursiv. Un subprogram se nume te recursiv dac în
cadrul defini iei sale se autoapeleaz .
Din matematic , multe defini ii utilizeaz construirea unor
concepte prin aceast metod special numit recursie. Astfel se
pot defini numerele naturale sau unele func ii:
Ø 1 este un num r natural
Ø succesorul unui num r natural este tot un num r natural
(bineîn eles mai trebuie definit apoi no iunea de succesor)
Ø func ia lui ACKERMANN:
| n+1 dac m=0;
ack(m,n)= | ack(m-1,1) dac n=0;
| ack(m-1,ack(m,n-1)) altfel;

B. Exemple de programe

Prezent m în continuare cateva programe simple cu solu ii


recursive pentru:

1. Calculul celui mai mare divizor comun (algoritmul lui EUCLID).

program exemplul_1;
uses crt;
var a,b:integer;
c:char;
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
repeat

1
clrscr;
write('Introduceti a : ');readln(a);
write('Introduceti b : ');readln(b);
writeln('cmmdc(',a,',',b,')=',cmmdc(a,b));
write('Inca o data ? (d/n)');c:=readkey;
until upcase(c)='N';
end.

2. Calculul lui n! (n factorial)

program exemplul_2;
uses crt;
var n:longint;
function fact(n:longint):longint;
begin
if n=0 then fact:=1
else fact:=fact(n-1)*n;
end;
begin
clrscr;
write('n= '); read(n);
write(' n! =',fact(n));
readkey;
end.

3. se calculeze suma primelor n numere naturale.

program exemplu_3;
uses crt;
var n:longint;
function suma(i:longint):longint;
begin
if i<>1 then suma:=suma(i-1)+i
else suma:=1;
end;
begin
write('n = ');readln(n);
writeln('suma primelor ',n,' numere naturale este : ',suma(n));
readkey;
end.

4. S se genereze parti iile unui num r natural n, doua parti ii


diferind fie prin valorile elementelor din parti ie, fie prin ordinea
acestora.

2
Solutie: Generarea parti iilor presupune alegerea primului termen din partitie - pi,
si apoi generarea tuturor parti iilor num rului n-pi.

program exemplu_4;
var p:array[1..20] of byte;
nn,n:byte;
procedure partitie(i,n:byte);
var j,k:byte;
begin
for j:=1 to n do
begin
p[i]:=j;
if n-j>0 then partitie(i+1,n-j)
else
if i>1 then
{partitia are cel putin doi termeni}
begin
write(nn,' = ',p[1]);
for k:=2 to i do write('+',p[k]);
readln
end
end
end;
begin
write('n= ');readln(n);
nn:=n;
partitie(1,n)
end.

5. Suma puterilor r cinilor

Fie ecua ia x2 - Sx + P = 0 cu S, P ∈ R si x1, x2 r cinile ecua iei.


se calculeze Sn= x1 + x2, n ∈ N.

ut m rela ia de recuren pentru Sn, tiind c x1, respectiv x2 sunt r cinile


ecua iei date i deci îndeplinesc rela iile :
x12 − Sx1 + P = 0
x 22 − Sx 2 + P = 0
Înmul im aceste rela ii cu x1n− 2 i x 2n− 2 i adun m rela iile ob inute i rezult :
Sn = x1n + x 2n = S * ( x1n−1 + x 2n −1 ) – P * ( x1n− 2 + x 2n− 2 ) = S*Sn-1 - P*Sn-2.

3
Astfel am ob inut o rela ie de recuren :

S0 = x0 + x0 = 2,
S1 = x1 + x2 = S,
Sn = S*Sn-1 - P*Sn-2, pentru n≥2.

program exemplu_5;
var n:integer;
S,P,R:real;
function suma(n:integer):real;
begin
if n=0 then suma:=2
else if n=1 then suma:=S
else suma:=S * suma(n-1) - P * suma(n-2);
end;
begin
writeln('Introduceti valorile ecuatiei de gradul II');
write('Dati S = ');readln(S);
write('Dati P = ');readln(P);
write(' N = ');readln(n);
if (n<0) and (int(n)<>n) then
begin
write('Valoare eronata pentru n');
exit
end;
R:=suma(n);
write('Valoarea lui S',n,' este ',R:6:2);
readln;
end.

6. se verifice egalitatea a dou iruri de caractere citite de la


tastatur .

program exemplu_6;
var a,b:string;
r:string[4];
function egal(a,b:string):boolean;
begin
if (a='') and (b='') then egal:=true
else
if (a='') or (b='') then egal:=false
else
if a[1]<>b[1] then egal:=false
else egal:=egal(copy(a,2,length(a)-1),copy(b,2,length(b)-1));

4
end;
begin
write('Introduceti sirul a = ');readln(a);
write('Introduceti sirul b = ');readln(b);
if egal(a,b) then r:=' = '
else r:=' <> ';
writeln('"',a,'"',r,'"',b,'"');
readln;
end.

7. S se afle elementul maxim dintr-un vector dat.


Solu ia este dat de rela ia recuren :
maxim(a1, a2 , . . . ,an) = maxim(an, maxim(a1, a2, . . . , an-1))

program exemplu_7;
type vector=array[1..100] of integer;
var a:vector;
i,n:integer;
function max(a,b:integer):integer;
begin
if a>b then max:=a
else max:=b;
end;
function maxim(a:vector;n:integer):integer;
begin
if n=1 then maxim:=a[1]
else maxim:=max(a[n],maxim(a,n-1));
end;
begin
write('Introduceti dimensiunea vectorului n = ');readln(n);
for i:=1 to n do
begin
write('a[',i,']= ');
readln(a[i])
end;
writeln('elementul maxim din vector este : ',maxim(a,n));
readln;
end.

C. Exerci ii i teme

5
1. se ruleze cele apte programe, urm rind apelurile i valorile parametrilor
de apel.
2. se scrie un program care s calculeze al n-lea termen din irul lui
Fibonacci, care este definit recursiv astfel:
fib[1]=0; fib[2]=1; fib[n]=fib[n-1]+fib[n-2]
3. se caute o solu ie nerecursiv pentru irul lui Fibonacci.
4. se calculeze func ia Manna-Pnueli, dat de rela ia :
| x-1, dac x>=12
f(x)=|
| f(f(x+2)), dac x<12
5. se scrie un program recursiv care s compare dou iruri de caractere.
6. scrie un program recursiv care s verifice dac dou iruri de caractere
sunt anagrame. Dou cuvinte sunt anagrame dac con in acelea i litere dar
în ordine diferit .
Exemplu: irul ‘DARIAN’ este anagrama pentru irul ‘ADRIAN’.

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