Sunteți pe pagina 1din 0

4.

Subprograme recursive


4.1. Sa se construiasca o unitate Pascal care sa contina subprograme recursive
pentru realizarea urmatoarelor operatii:
suma elementelor unui vector;
produsul elementelor unui vector;
factorialul unui numar natural;
generarea unui termen din sirul lui Fibonacci;
minimul dintr-un vector;
maximul dintr-un vector;
produsul scalar dintre doi vectori;
sortarea unui vector;
valoarea unui polinom ntr-un punct dat;
ridicarea unei matrice la o putere data.
Parametrii de intrare de tip vector si matrice sunt transmisi prin adresa
deoarece, prin recursivitate, duplicarea repetata a masivelor n stiva poate genera
depasirea acesteia.
Tipul functiei factorial a fost ales REAL deoarece domeniul de valori pentru
cel mai mare tip ntreg (LONGINT) este valabil numai pna la 12!.
Pentru exemplificarea maximului dintr-un vector s-a ales varianta procedurii
recursive, subprogramul de tip functie fiind similar celui de determinare a
minimului.
Functia pol care determina valoarea unui polinom ntr-un punct dat apeleaza un
subprogram intern recursiv (functia put) pentru ridicarea unui numar la o putere.
Procedura putere este functionala si pentru ridicarea unei matrice la puterea 0,
returnnd matricea unitate.
Procedura sort realizeaza sortarea unui vector prin metoda bulelor.

unit recursiv;
INTERFACE
type
{tipuri publice}
vector=array[1..100] of real;
matrice=array[1..20,1..20] of real;
{suma elementelor unui vector}
function suma(n:byte; var v:vector):real;
{produsul elementelor unui vector}
function produs(n:byte; var v:vector):real;
{factorialul unui numar natural}
function factorial(n:byte):real;
{generarea unui termen din sirul lui Fibonacci}
function fibonacci(n:byte):longint;

{minimul dintr-un vector}
function min(n:byte; var v:vector):real;
Algoritmi n programare. Aplicatii
{maximul dintr-un vector}
procedure maxim(n:byte; var v:vector; var max:real);
{produsul scalar dintre doi vectori}
function ps(n:byte; var v,w:vector):real;
{sortarea unui vector}
procedure sort(n:byte; var v:vector);
{valoarea unui polinom intr-un punct dat}
function pol(n:byte; var v:vector; x:real):real;
{ridicarea unei matrice la o putere data}
procedure putere(n,p:byte; var a,b:matrice);
IMPLEMENTATION
Var
i,j,k:byte; {variabile globale unitatii}
function suma;
begin
if n=0 then suma:=0
else suma:=suma(n-1,v)+v[n]
end;
function produs;
begin
if n=0 then produs:=1
else produs:=produs(n-1,v)*v[n]
end;
function factorial;
begin
if n<2 then factorial:=1
else factorial:=factorial(n-1)*n
end;
function fibonacci;
begin
if n<3 then fibonacci:=1
else fibonacci:=fibonacci(n-2)+fibonacci(n-1)
end;
function min;
begin
if n=1 then min:=v[n]
else if v[n]<min(n-1,v) then min:=v[n]
else min:=min(n-1,v)
end;
procedure maxim;
begin
if n=1 then max:=v[n]
else
begin
maxim(n-1,v,max); {apel recursiv}
if v[n]>max then max:=v[n]
end
end;
function ps;
begin
Subprograme recursive
if n=0 then ps:=0
else ps:=ps(n-1,v,w)+v[n]*w[n]
end;
procedure sort;
var vb:boolean;
aux:real;
begin
vb:=false;
for i:=1 to n-1 do
if v[i]>v[i+1] then begin
aux:=v[i];
v[i]:=v[i+1];
v[i+1]:=aux;
vb:=true
end;
if vb then sort(n,v) {apel recursiv}
end;
function pol;
function put(y:real; n:byte):real;
begin
if n=0 then put:=1
else put:=put(y,n-1)*y
end;
begin
if n=0 then pol:=v[1]
else pol:=pol(n-1,v,x)+v[n]*put(x,n)
end;
procedure putere;
var c:matrice;
begin
if p=0 then
for i:=1 to n do
for j:=1 to n do
if i=j then b[i,j]:=1 else b[i,j]:=0
else begin
putere(n,p-1,a,b);
for i:=1 to n do
for j:=1 to n do
begin
c[i,j]:=0;
for k:=1 to n do c[i,j]:=c[i,j]+b[i,k]*a[k,j]
end;
for i:=1 to n do
for j:=1 to n do b[i,j]:=c[i,j]
end
end;
BEGIN
END.
Algoritmi n programare. Aplicatii
4.2. Sa se realizeze programul Pascal care apeleaza subprograme din unitatea
conceputa la exercitiul 4.1.
Programul principal care apeleaza unitatea recursiv este conceput
multifunctional (modularizat), astfel nct utilizatorul sa poata opta pentru una din
functiuni, avnd posibilitatea reluarii prin citirea de la tastatura a optiunii dorite. De
asemenea, programul principal apeleaza unitatea masive (construita la exercitiul
3.3), din care foloseste subprogramele citire_vector, afisare_vector,
citire_matrice si afisare_matrice.

program apelator_recursiv;
uses recursiv,masive,crt;
var
a,b:matrice;
x,y:vector;
i,j,m,n,opt:byte;
p:real;
procedure meniu;
begin
clrscr;
textcolor(yellow+blink);
gotoxy(20,1); write(' APLICATIE CU SUBPROGRAME RECURSIVE ');
textcolor(white);
gotoxy(1,5); write(' 1 ? Suma elementelor unui vector');
gotoxy(1,6); write(' 2 ? Produsul elementelor unui vector');
gotoxy(1,7); write(' 3 ? Factorialul unui numar natural');
gotoxy(1,8); write(' 4 ? Generarea unui termen Fibonacci');
gotoxy(1,9); write(' 5 ? Minimul dintr-un vector');
gotoxy(1,10); write(' 6 ? Maximul dintr-un vector');
gotoxy(1,11); write(' 7 ? Produsul scalar dintre doi vectori');
gotoxy(1,12); write(' 8 ? Sortarea unui vector');
gotoxy(1,13); write(' 9 ? Valorea unui polinom intr-un punct');
gotoxy(1,14); write('10 ? Ridicarea unei matrice la o putere');
textcolor(magenta+blink);
gotoxy(27,20);
write('Pentru iesire tastati 0');
textcolor(yellow+blink);
gotoxy(30,22);
clreol;
write('Alegeti optiunea: ');
textcolor(white);
readln(opt)
end;
{programul principal}
begin
meniu;
while opt<>0 do begin
case opt of
1: begin
clrscr;
citire_vector(n,x);
writeln('Suma elementelor este', suma(n,x):8:2);
readln
end;
Subprograme recursive
2: begin
clrscr;
citire_vector(n,x);
writeln('Produsul elementelor este', produs(n,x):8:2);
readln
end;
3: begin
clrscr;
write('Numarul:'); readln(n);
writeln(n,'!=',factorial(n):8);
readln
end;
4: begin
clrscr;
write('Termenul Fibonacci de generat:'); readln(n);
writeln('Al ',n,'-lea termen este',fibonacci(n):6);
readln
end;
5: begin
clrscr;
citire_vector(n,x);
writeln('Minimul din vector este', min(n,x):8:2);
readln
end;
6: begin
clrscr;
citire_vector(n,x);
maxim(n,x,p);
writeln('Maximul din vector este', p:8:2);
readln
end;
7: begin
clrscr;
citire_vector(n,x); {citire vector 1}
citire_vector(m,y); {citire vector 2}
if n<>m then writeln('Dimensiuni incompatibile!')
else writeln('Produsul scalar este', ps(n,x,y):8:2);
readln
end;
8: begin
clrscr;
citire_vector(n,x);
sort(n,x);
writeln('Vectorul sortat este:');
afisare_vector(n,x);
readln
end;
9: begin
clrscr;
write('Gradul polinomului:'); readln(n);
writeln('Coeficientii polinomului:');
for i:=1 to n+1 do begin
write('coeficientul lui x la puterea ',i-1,' = ');
readln(x[i])
end;
Algoritmi n programare. Aplicatii
write('Punctul pentru care se va calcula valoarea:');
readln(p);
writeln('Valoarea polinomului in punctul',p:3:0,
' este ',pol(n,x,p):6:2);
readln
end;
10: begin
clrscr;
citire_matrice(n,n,a);
write('Puterea:'); readln(m);
putere(n,m,a,b);
afisare_matrice(n,n,b);
readln
end
else begin
gotoxy(48,22);clreol;
textcolor(red+blink);
write('OPTIUNE ERONATA!',#7);
readln;
textcolor(white)
end
end {case-of};
meniu
end {while}
end.

Dupa lansarea n executie a programului apelator, ecranul principal va
arata ca n figura urmatoare.