Sunteți pe pagina 1din 6

LUCRAREA nr. 1 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 (binen 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

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 cinile ecua iei.

Fie ecua ia x2 - Sx + P = 0 cu S, P R si x1, x2 r 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 2 x2 Sx 2 + P = 0 n 2 nmul im aceste rela ii cu x1n 2 i x 2 i adun m rela iile ob inute i rezult : n n n 1 n 1 n 2 n 2 Sn = x1 + x 2 = S * ( x1 + x 2 ) P * ( x1 + x 2 ) = S*Sn-1 - P*Sn-2.

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

se verifice egalitatea a dou tastatur .


6.

iruri de caractere citite de la

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));

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.

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.

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

C. Exerci ii i teme

1. 2. 3. 4.

5. 6.

se ruleze cele apte programe, urm rind apelurile i valorile parametrilor de apel. 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] se caute o solu ie nerecursiv pentru irul lui Fibonacci. se calculeze func ia Manna-Pnueli, dat de rela ia : | x-1, dac x>=12 f(x)=| | f(f(x+2)), dac x<12 se scrie un program recursiv care s compare dou iruri de caractere. 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