Sunteți pe pagina 1din 8

2011

2011

Recursivitate 1.Aspecte teoretice 1.1 Ce este recursivitatea? Recursivitatea, folosit cu mult eficien n matematic, s-a impus n programare, odata cu apariia unor limbaje de nivel inalt, ce permit scrierea de module ce se autoapeleaz (PASCAL,LISP,ADA,ALGOL,C sunt limbaje recursive, spre deosebire de FORTRAN,BASIC,COBOL, nerecursive). Recursivitatea e strns legat de iteratie, dar dac iteratia e execuia repetat a unei poriuni de program, pn la ndeplinirea unei conditii (while, repeat, for din PASCAL), recursivitatea presupune executia repetata a unui modul, insa n cursul executiei lui (i nu la sfrsit, ca n cazul iteratiei), se verifica o conditie a crei nesatisfacere, implica reluarea executiei modulului de la inceputul sau. Atunci un program recursiv poate fi exprimat: P=M(i,P) , unde M este multimea ce contine instructiunile i i pe P insusi. Structurile de program necesare i suficiente n exprimarea recursivitii sunt procedurile i subrutinele ce pot fi apelate prin nume. Recursivitatea poate fi: -direct - un modul P contine o referin la el insui -indirect - un modul P contine o referin la un modul Q ce include o referin la P.

1.2 Parametrii-valoare i parametrii-variabil Discutia se face pentru cazul implementarii recursivitii n PASCAL, dar lucrurile sunt similare pentru C. n PASCAL, exista doua tipuri de parametri formali (ce apar n antetul unei proceduri sau functii) : valoare i variabila (ultimii au numele precedat de cuvntul cheie var). Apelul recursiv al unei proceduri (functii) face ca pentru toti parametriivaloare s se creeze copii locale apelului curent (n stiva) , acestea fiind referite i asupra lor facndu-se modificarile n timpul executiei curente a procedurii (functiei). Cnd executia procedurii (functiei) se termina, copiile sunt extrase din stiv, astfel incit modificarile operate asupra parametrilor-valoare nu afecteaza parametrii efectivi de apel, corespunzatori. De asemenea pentru toate variabilele locale se rezerva spatiu la fiecare apel recursiv. n cazul parametrilor-variabila, nu se creaza copii locale, ci operarea se face direct asupra spatiului de memorie afectat parametrilor efectivi, de apel. De reinut: -pentru fiecare apel recursiv al unei proceduri (functii) se creaza copii locale ale parametrilor valoare i variabilelor locale, ceea ce poate duce la risipa de memorie; -orice parametru-variabila poate fi suprimat prin referirea direct n procedura (functie) a variabilei ce figura ca parametru de apel.

1.3 Verificarea i simularea programelor recursive Se face ca n cazul celor nerecursive, printr-o demonstratie formala, sau testind toate cazurile posibile. Se verifica intii dac toate cazurile particulare (ce se executa cind se indeplineste conditia de terminare a apelului recursiv) functioneaza corect. Se face apoi o verificare formala a procedurii (functiei) recursive, pentru restul cazurilor, presupunind ca toate componentele din codul procedurii (functiei) functioneaza corect. Verificarea e deci inductiva.Acesta e un avantaj al programelor recursive, ce permite demonstrarea corectitudinii lor simplu i clar. Exemplificare: Funcia recursiv de calcul a factorialului: function fact(n:integer):integer; begin if n=1 then fact:=1 else fact:=n*fact(n-1) end; Demonstrarea corectitudinii cuprinde doi pai: -pentru n=1 valoarea 1 ce se atribuie factorialului este corecta -pentru n>1, presupunind corecta valoarea calculata pentru predecesorul lui n de fact(n-1), prin inmultirea acesteia cu n se obtine valoarea corect a factorialului lui n.

1.4 Tehnica eliminrii recursivitii Orice program recursiv poate fi transformat n unul iterativ, dar algoritmul sau poate deveni mai complicat i mai greu de inteles. De multe ori, solutia unei probleme poate fi elaborata mult mai usor, mai clar i mai simplu de verificat, printr-un algoritm recursiv. Dar pentru implementare, poate fi necesara transformarea algoritmului recursiv n unul nerecursiv, n situatiile: -solutia problemei trebuie scrisa intr-un limbaj nerecursiv; un caz particularsuntcompilatoarele ce "traduc" un program recursiv dintr-un limbaj de nivel inalt n cod masina (nerecursiv) -varianta recursiv ar duce la o viteza de executie i spatiu de memorie prea mari, transformarea n una nerecursiv, eliminind dezavantajele. Se va prezenta una din metodele de eliminare a recursivitii ce foloseste o structura de date de tip stiva. n scrierea unei varianta nerecursive, trebuie parcursi toti paii implicati n varianta recursiv, prin tehnici nerecursive. Recursivitatea implica folosirea a cel putin unei stive. La fiecare apel recursiv sunt depuse n stiv niste date, caresuntextrase la revenirea din acel apel. E simplu dac datele pentru un apel se organizeaza intr-un record, un apel nsemnnd introducerea n stiv a unui record, revenirea, extragerea lui. Se prezint eliminarea recursivitii pentru un program simplu, care citeste caracterele tastate pe o linie, tiprindu-le apoi n ordine invers. program var_recursiv; procedure prel_car; var car:char; be read(car); if not eoln then prel_car; write(car) end; begin prel_car end.

1.5 Exemple de algoritmi recursivi 1.5.1 Algoritmi de traversare i inversare a unei structuri Traversarea i inversarea unei structuri inseamna efectuarea unor operatii oarecare asupra tuturor elementelor unei structuri n ordine direct, respectiv n ordine inversa. Dei mai uzualesuntvariantele iterative, caz n care inversarea echivaleaza cu doua traversari directe (o salvare n stiva urmata de parcurgerea stivei), variantele recursivesuntmai elegante i concise. Se pot aplica structurilor de tip tablou, lista, fisier i pot fi o solutie pentru diverse probleme (transformarea unui intreg dintr-o baza n alta, etc). Intr-o forma general, algoritmii se pot scrie: procedure traversare(element:tip_element); {apelul iniial} {al procedurii se face cu primul element al structurii} begin prelucrare(element); if element <> ultimul_din_structura then traversare(element_urmator) end; procedure inversare(element:tip_element); {apelul iniial} {al procedurii se face cu primul element al structurii} begin if element <> ultimul_din_structura then traversare(element_urmator); prelucrare(element) end; De observat importanta ca parametrul formal al celor doua proceduri s fie de tip valoare, pentru a nu fi alterat de apelul recursiv.

1.5.2 Algoritmi care implementeaz definiii recursive O definitie recursiv e cea n care un obiect se defineste prin el insusi. Definitia contine o conditie de terminare, indicnd modul de parasire a definitiei i o parte ce precizeaza definirea recursiv propriu-zis. Ca exemple: algoritmul lui Euclid de aflare a c.m.m.d.c., factorialul, ridicarea la o putere intreag (prin inmultiri repetate), definirea recursiv a unei expreii aritmetice, curbele recursive, un mod de a privi permutarile, etc.

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