Sunteți pe pagina 1din 2

RECURSIVITATE

ny212i6533cyyo Prin recursivitate se intelege faptul ca un subprogram se apeleaza pe el insusi, apelul aparand atunci cand subprogramul este inca activ. Exista doua tipuri de recursivitate: 1) ny212i6533cyyo recursivitate directa - cand un subprogram se autoapeleaza in corpul sau ; 2) ny212i6533cyyo recursivitate indirecta - cand avem doua subprograme (x si y), iar x face appel la y si invers ;

Se folosesc algoritmi recursivi atunci cand calculele aferente sunt descrise in forma recursiva. Recursivitatea este frecvent folosita in prelucrarea structurilor de date definite recursiv. Un subprogram recursiv trebuie scris astfel incat sa respecte regulile : a) Subprogramul trebuie sa poata fi executat cel putin o data fara a se autoapela ; b)Subprogramul recursiv se va autoapela intr-un mod in are se tinde spre ajungerea in situatia de executie fara autoapel. ny212i6533cyyo ny212i6533cyyo Pentru a permite apelarea recursiva a subprogramelor, limbajul Pascal dispune de mecanime speciale de suspendare a executiei programului apelant, de salvare a informatiei necesare si de reactivare a programului suspendat . ny212i6533cyyo Pentru implementarea recursivitatii se foloseste o zona de memorie in care se poate face salvarea temporala a unor valori. La fiecare appel recursiv al unui subprogram se salveaza in aceasta zona de memorie starea curenta a executiei sale. ny212i6533cyyo Desi variabilele locale ale subprogramului apelant au aceleasi nume cu cele ale subprogramului apelat, orice referire la acesti identificatori se asociaza ultimului set de valori alocate in zona de memorie. Zona de memorie ramane alocata pe tot parcursul executie subprogramului apelat si se dealoca in momentul revenirii in programul apelat. Zona de memorie nu este gestionata explicit de programator ci de catre limbaj. ny212i6533cyyo La terminarea executiei subprogramului apelat recursiv, se reface contextul programului din care s-a facut apelul. Datorita faptului ca la fiecare autoapel se ocupa o zona de memorie, recursivitatea este eficienta numai daca numarul de autoapelari nu este prea mare pentru a nu se ajunge la umplerea zonei de memorie alocata. Recursivitatea ofera avantajunl unor solutii mai clare pentru probleme si a unei lungimi mai mici a programului. Ea prezinta insa dezavantajul unui timp mai mare de executie si a unui spatiu de memorie alocata ami mare. Este de preferat ca atunci cand programul recursiv poate fi transformat intr-unul iterativ sa se faca apel la cel din urma. OTIUNI DESPRE RECURSIVITATE

Recursivitatea este una din notiunile fundamentale ale informaticii.Utilizarea frecventa a recursivitatii s-a facut dupa anii '80.Multe din limbajele de programare evoluate si mult utilizate(Fortran ,Cobol) nu permiteau scrierea programelor recursive. In linii mari,recursivitatea este un mecanism general de elaborare a programelor .Ea a aparut din necesitati practice (transcrierea directa a formulelor matematice recursive) si reprezinta acel mecanism prin care un subprogram(procedura,functie) se autoapeleaza. Daca lucrurile par usor de inteles in cazul functiilor,nu tot atat de simplu este sa aplicam recursivitatea utilizand proceduri.Astfel vom vedea ca putem genera recursiv probleme de genul permutarilor.

Un algoritm recursiv are la baza un mecanism de gandire diferit de cel cu care ne-am obisnuit deja.Atunci cand scriem un algoritm recursiv este suficient sa gandim ce se intampla la un anumit nivel pentru ca la orice nivel se intampla exact acelasi lucru. Un algoritm recursiv corect trebuie sa se termine ,contrar programul se va termina cu eroare si nu vom primi rezultatul asteptat.Conditia de terminare va fi pusa de programator.58884nrh57nfy5t Un rezultat matematic de exceptie afirma ca pentru orice algoritm iterativ exista si unul recursiv echivalent(rezolva aceeasi problema) si invers,pentru orice algoritm recursiv exista si unul iterativ echivalent. In continuare, raspundem la intrebarea:care este mecanismul intern al limbajului care permite ca un algoritm recursiv sa poata fi implementat? Pentru a putea implementa recursivitatea ,se foloseste structura de date numita stiva. Mecanismul unui astfel de program poate fi generalizat cu usurinta pentru obtinerea recursivitatii.Atunci cand o procedura sau o functie se autoapeleaza se depun in stiva:

valorile parametrilor transmisi prin valoare adresele parametrilor transmisi prin referintarf884n8557nffy valorile tuturor variabilelor locale(declarate la nivelul procedurii sau functiei)

Din punct de vedere al modului in care se realizeaza autoapelul ,exista doua tipuri de recursivitate:direct si indirecta. Recursivitatea directa a fost deja prezentata.Recursivitatea indirecta are loc atunci cand o procedura (functie) apeleaza o alta procedura(functie),care la randul ei o apeleaza pe ea. Un astfel de exemplu ar fi urmatorul: Se considera doua valori reale,pozitive a0,b0 si n un numar natural. Definim sirul: an=(an-1+bn-1)/2 bn=an-1bn-1

Vom folosi doua functii a(n) si b(n).Fiecare dintre ele se autoapeleaza dar o apeleaza si pe cealalalta.