Sunteți pe pagina 1din 3

CAP 8 RECURSIVITATE.

begin
if m=0 then ak:=n+1
else
8.1. Prezentare generală.
if n=0 then ak:=ak(m-1,1);
Recursivitatea, folosită cu multă eficienŃă în matematică, s-a impus în
if (m<>0) and (n<>0) then ak:=ak(m-1,ak(m,n-1));
programare, odată cu apariŃia unor limbaje de nivel înalt, ce permit
end;
scrierea de module ce se autoapelează (PASCAL, LISP, ADA,
ALGOL, C sunt limbaje recursive, spre deosebire de FORTRAN,
begin
BASIC, COBOL, nerecursive).
write('m,n= ');
Recursivitatea e strâns legată de iteraŃie, dar dacă iteraŃia e
readln(m,n);
execuŃia repetată a unei porŃiuni de program, până la îndeplinirea
write(ak(m,n));
unei condiŃii (while, repeat, for din PASCAL), recursivitatea
readln;
presupune execuŃia repetată a unui modul, însă în cursul execuŃiei lui
end.
(şi nu la sfârşit, ca în cazul iteraŃiei), se verifică o condiŃie a cărei
nesatisfacere implică reluarea execuŃiei modulului de la începutul său.
Exemple la recursivitatea directă prin comparare cu metoda
Atunci un program recursiv poate fi exprimat: P=M(Si,P) , unde M
iterativă
este mulŃimea ce conŃine instrucŃiunile Si şi pe P însuşi.
Varianta iterativă Varianta recursivă
Structurile de program necesare şi suficiente în exprimarea
recursivităŃii sunt procedurile şi subrutinele ce pot fi apelate prin nume. Factorial
Recursivitatea poate fi directă - un modul P conŃine o referinŃă la el Program Factorial; Program Factorial;
însuşi, sau indirectă - un modul P conŃine o referinŃă la un modul Q ce Var n:integer; Var n:integer;
include o referinŃă la P. Function fact(n:integer):integer; Function fact(n:integer):integer;
Var j, f:integer; Begin
8.2. Proceduri si funcŃii recursive. Begin if n=1 then fact:=1
FuncŃia lui Akermann f:=1; else fact:=n*fact(n-1)
ScrieŃi subprogramul recursiv care calculează funcŃia lui Akermann For j:=1 to n do f:=f*j; end;
definită astfel:AK:N*N-N Fact:=f;
End;
N+1; dacă m=0
AK(m,n)= AK(m-1,1) dacă n=0 Begin Begin
AK(m-1,AK(m,n-1) dacă m<>0 si n<>0 Write(‘ Dati n= ‘); readln(n); Write(‘ Dati n= ‘); readln(n);
Write(n,’! =’,fact(n)); Write(n,’! =’,fact(n));
Program Ackermann; End. End.
var n,m:integer;
Function AK(m,n:integer):integer;

35
Proceduri recursive if c<>#13 then
begin
Varianta iterativă Varianta recursivă inv:=inv+c;
Inversarea elementelor dintr-un şir end
Program Inversare; Program Inversare; else inv:='';
Var a:array [1..100] of integer; Var a:array [1..100] of integer; end;
n,i:integer; n:integer; Begin
writeln(inv);
Procedure Inv; Procedure Inv(j:integer); End.
Var j,aux:integer; Begin
Begin Aux:=a[j]; {Scrieti un subprogram recursiv care afiseaza in ordine inversa un sir
For j:=1 to n div 2 do begin a[j]:=a[n-j+1]; de caractere citit de la tastatura}
aux:=a[j]; a[n-j+1]:=aux; program invers_sir;
a[j]:=a[n-j+1]; if j<n div 2 then Inv(j+1); procedure inv;
a[n-j+1]:=aux; End; var c:char;
end; begin
End; Begin read(c);
Write (‘ Dati n=’ ); readln(n); if c<>#13 then
Begin For i:=1 to n do readln(a[i]); begin
Write (‘ Dati n=’ ); readln(n); Inv; inv;
For i:=1 to n do readln(a[i]); End. write(c);
Inv; end;
End. end;
Begin
inv;
Exemple de programe recursive End.

{Scrieti un subprogram recursiv care returnează in ordine inversa un


sir de caractere citit de la tastatura} {ScrieŃi o funcŃie recursivă care inversează cifrele unui număr primit
program invers_sir; ca parametru}
function inv:string; program numar_invers;
var c:char; var n:longint;
begin function inv(n:longint):longint;
read(c); begin

36
if n<10 then inv:=n else inv:=x[length(x)]+inv(copy(x,1,length(x)-1));
else inv:=(n mod 10)*trunc(exp(trunc(ln(n)/ln(10))*ln(10)))+inv(n div end;
10); begin
end; write('Dati s:');readln(s);
BEGIN writeln(inv(s));
readln(n); readln;
writeln(inv(n)); end.
readln;
END.

{Sa se calculeze produsul a doua numere folsind doar adunari si


inmultiri cu 2}
program inmultesc;
var a,b:integer;
function i(a,b:integer):integer;
begin
if (a=0)or(b=0) then i:=0
else if a mod 2=0 then i:=i(a div 2, b*2)
else i:=i(a div 2, b*2)+b;
end;
Begin
readln(a,b);
writeln('a*b=',i(a,b));
End.

{Să se scrie un subprogram recursiv care inversează un şir de


caractere primit ca parametru}
program inversul_unui_sir_de_caractere;
var s:string;
function inv(x:string):string;
begin
if length(x)=1 then inv:=x

37

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