You are on page 1of 2

Proceduri recursive

n majoritatea manualelor de informatic tema Recursia este expus


doar prin exemple de funcii. Totodat, la exerciiile pentru rezolvare se propun
exemple care necesit abordarea recursiei cu ajutorul procedurilor. ( Afiarea unui
vector, inversia valorilor ntr-un vector .a). n acest articol mi expun propria
viziune asupra temei i voi oferi cteva exemple de proceduri recursive.
Pentru a nelege recursivitatea este nevoie de a face o incursiune n structura
memoriei calculatorului. Toate subprogramele se lanseaz i ruleaz n segmentul
de memorie steak, care are o structur de stiv. Stiva funcioneaz conform
principiului FILO(primul intrat-ultimul ieit). n procesul derulrii subprogramelor
deosebim dou etape: ncrcarea stivei i descrcarea ei, adic depunerea
calculelor i calculele propriu zise. Presupunem c trebuie s afim un vector cu
n elemente de tip ntreg. Regula de consisten e simpl n=n-1+1. Adic n i=ni1+1. Valorile vectorului se vor depune n stiv att timp ct n>1 i se va finaliza
cnd n=1. Prin n am nsemnat valoarea indicelui vectorului. Presupunem c
avem un vector cu trei valori V[1]:=5;V[2]:=3;V[3]:=-6; Indicele maximal n=3.
Practic vom lucra cu variabila global de tip vector(array), iar pe stiv vom
depune indicii.
Procedure afisvect(k:integer);
3
2
1
Begin
If k>1 then afisvec(k-1);
Write(v[k]:3);
End;

2
3
Fig. 1

n fig. 1 este artat procesul de ncrcare a stivei. Apelul se efectueaz din blocul
apelant afisvect(n) unde n=3. La primul apel ntruct n>1, indicele al 3-lea se
depune pe ultimul nivel al stivei. La primul autoapel k=2 i pe primul nivel se
depune indicele al 2-lea, iar indicele 3 se deplaseaz pe nivelul doi, la al doilea
autoapel pe primul nivel se depune indicele 1, care deplaseaz indicii 2 i 3 pe
nivelele respective. n acest moment se ndeplinete i condiia de oprire a
autoapelurilor. Urmeaz descrcarea stivei. Fig. 2
V[1]
2

V[2]

V[3]

Fig.2
Ca rezultat pe ecran vom avea un ir de numere 5 3 -6 ,care reprezint valorile
vectorului V. Problema este rezolvat.

Exemplul urmtor vine s dezvolte proprietile procedurii prin inversia unui


vector n el nsui:
Program cu_procedura;
Type vector=array[1..200] of integer;
Var V:vector; j,n:integer;
Procedure invervec(k:integer);
Begin
If k<n then invervect(k+1);
Writeln(v[k]);
End;
Begin
Write(lungimea vectorului n=);
Readln(n);
For j:=1 to n do begin
Write(v[,j,]=); readln(v[j]);
End;
Invervect(1);
readln
End.
n ultimul caz am folosit proprietile stivei pentru a inversa ordinea de
afiare, am nceput ncrcarea ei de la nivelul superior cu primul indice al
vectorului. Respectiv la momentul descrcrii pe nivelul superior se afla indicele
n, iar pe primul, cel inferior, indicele cu valoarea 1. Pe ecran se va afia
succesiunea : V[n],V[n-1]V[2],V[1].
n final propun procedura de convertire a unui numr zecimal a n baza b<10.
Procedure baza(a,b:integer);
Var R:integer;
Begin
R:=a mod b;
If a>b then baza( a div b,b);
Write(r);
End;
Procedura recursiv de conversie a unui numr zecimal n alt baz numeric
este un caz fericit care demonstreaz elegana recursivitii . Procedura
iterativ este mult mai complicat i voluminoas.
Sergiu Gnga, profesor informatic,
grad didactic superior,
Liceul Teoretic C.Stere, Soroca

You might also like