Documente Academic
Documente Profesional
Documente Cultură
ALGORITMI RECURSIVI
A. Considera ii teoretice
B. Exemple de programe
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.
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.
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.
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.
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.
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.
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’.