Sunteți pe pagina 1din 4

1.

RECURSIVITATE

1. RECURSIVITATE
1.1. Conceptul de recursivitate
n informatic i n matematic, recursivitatea este un concept fundamental.
Spunem c o noiune este definit recursiv dac n cadrul definiiei intervine
nsi noiunea care se definete.
De exemplu un descendent al unei persoane este un copil al su sau un
descendent al unui copil al su. n acest caz, pentru a defini noiunea de
descendent am folosit noiunea nsi.
n matematic apar frecvent relaii recursive, denumite i relaii de recuren.
De exemplu, s considerm irul Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, 21,...
Observm c n acest ir primii doi termeni sunt 0 i 1, iar n rest, fiecare
termen se obine nsumnd cei doi termeni care l preced. Prin urmare, o definiie
recursiv pentru irul Fibonacci este:
fib : N N
dac n 1
fib(n) = n,
dac n > 1
fib(n 1) + fib(n 2),
Apare ntrebarea: orice descriere de acest tip este corect? S considerm
urmtorul exemplu:
f :N N
dac n = 0
f (n) = 1,
dac n > 0
1 + f (n + 1),
Observai c f(0)=1, iar dac n>1, pentru a calcula f(n) trebuie s evalum
mai nti f(n+1). Dar pentru a evalua f(n+1), va fi nevoie de f(n+2),
deoarece n>0 implic n+1>0, .a.m.d. Prin urmare, funcia f nu poate fi evaluat
dect pentru 0.

Regula fundamental pentru ca recursia s fie definit corect este:


1. trebuie s existe cazuri elementare, care se pot rezolva direct;
2. pentru cazurile care nu se rezolv direct, recursia trebuie s progreseze ctre un
caz elementar.
Exemplul precedent ncalc a doua parte a acestei reguli.
O greeal care apare frecvent este ns i nclcarea primei reguli. De exemplu,
am solicitat unui elev s descrie o funcie recursiv care s calculeze suma cifrelor
unui numr natural. A abordat problema excelent: suma cifrelor unui numr natural

1. RECURSIVITATE

n se obine adunnd ultima cifr a numrului n (n%10) cu suma cifrelor numrului


natural care se obine eliminnd ultima cifr din n (sum(n / 10)) i a scris relaia
urmtoare:
sum: N N
sum(n) = n%10+sum(n/10);
Evident, a uitat cazurile elementare. Ca urmare, recursia nu se oprete niciodat:
pentru a calcula suma cifrelor numrului natural, se elimin succesiv cifrele sale,
pn cnd argumentul n devine 0. Din acest moment, se evalueaz la infinit
sum(0), deoarece 0/10 este permanent 0.
Deci, corect ar fi fost:
dac n = 0
sum(n) = 0,
n
%
10
+
sum
(
n
/
10
),
dac
n>0

1.2. Mecanismul de realizare a recursivitii


Recursivitatea se realizeaz prin intermediul funciilor.
O funcie se numete recursiv dac se autoapeleaz.
Autoapelarea se poate realiza n dou moduri: direct (n acest caz n corpul
funciei apare explicit un apel recursiv) sau indirect (n corpul funciei apare apelul
unei alte funcii care la rndul su apeleaz direct sau indirect funcia respectiv).
Mecanismul care face posibil recursivitatea deriv din modul de funcionare a
funciilor. Ca n cazul oricrui apel de funcie i n cazul funciilor recursive se
aloc zon de memorie pe stiv pentru valorile parametrilor, precum i pentru
valorile variabilelor locale. Aceast zon de memorie rmne alocat pe tot
parcursul execuiei apelului funciei, fiind eliberat la momentul revenirii n funcia
apelant. Stiva nu este gestionat explicit de ctre programator, ci de ctre sistem.
Pentru a nelege mai exact s analizm urmtoarea problem.

Inversarea unui cuvnt


S se scrie o funcie recursiv care citete un cuvnt, caracter cu caracter, i
afieaz cuvntul n ordine, apoi cuvntul inversat. Marcajul de sfrit de cuvnt
este caracterul spaiu.

Calculul celui mai mare divizor comun al dou numere naturale


Date a i b N, scriei o funcie recursiv de calcul al celui mai mare divizor
comun al numerelor a i b folosind algoritmul lui Euclid.

1. RECURSIVITATE

Funcia Ackermann
Evaluai funcia Ackerman pentru m, n numere naturale date.
Funcia Ackermann este: ac : N x N N,

Numrare
Fie a1, a2, ..., an un ir de n (0<n<20) numere ntregi i x un numr ntreg.
Scriei o funcie recursiv care s determine numrul de apariii ale lui x n ir.

Generare
Fie n N*. S se genereze toate succesiunile de n (n<20) caractere '.' i '_'
(asemntor codurilor Morse).
De exemplu, pentru n=2 vei afia:
.
.
_
_

.
_
.
_

Generarea produsului cartezian


Fie n N* i A1, A2, ..., An n mulimi cu L1, L2, ..., respectiv Ln elemente. S se
genereze elementele produsului cartezian A1xA2x...xAn.
Prin definiie produsul cartezian A1xA2x...xAn este mulimea n-uplelor (e1,
e2, ..., en) cu proprietatea c eiAi, pentru i{1, 2, ..., n}.
De exemplu pentru n=3 i L=(2, 3, 2), elementele produsului cartezian sunt:
(1,1,1), (1,1,2), (1,2,1), (1,2,2), (1,3,1), (1,3,2), (2,1,1), (2,1,2), (2,2,1),
(2,2,2), (2,3,1), (2,3,2). Observai c produsul cartezian are L1*L2*...*Ln
elemente.

Generarea permutrilor
Fie n N*. Scriei un program recursiv de generare a permutrilor de ordin n.
De exemplu, pentru n=3 programul va genera:
1
1
2
2
3

2
3
1
3
1

3
2
3
1
2

1. RECURSIVITATE

3 2 1

Generarea aranjamentelor
Fie nN* i mN, mn. Scriei un program recursiv care s genereze
aranjamentele de n elemente luate cte m.
De exemplu, pentru n=3 i m=2, programul va genera:
1
1
2
2
3
3

2
3
1
3
1
2

Generarea combinrilor
Fie nN* i mN, mn. Scriei un program recursiv care s genereze
combinrile de n elemente luate cte m.
De exemplu, pentru n=4 i m=2, programul va genera:
1
1
1
2
2
3

2
3
4
3
4
4

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