Sunteți pe pagina 1din 21

Programare procedural C8

Recursivitate (algoritmi, tehnici de programare)

Grigore ALBEANU
http://www.ad-astra.ro/galbeanu/
Cuprins

z Noiunea de recursivitate
z Algoritmi recursivi / Funcii recursive
z Implementarea algoritmilor recursivi n
limbajele de programare
z Metoda Divide et impera
z Complexitatea algoritmilor recursivi
z Recursivitate versus Iterativitate
Noiunea de recursivitate
z n general, prin recursivitate se
nelege proprietatea intrinsec a
unei entiti (fenomen, proces etc.)
de a fi definit i/sau analizat
folosind entiti de aceeai natur.
z Un algoritm n a crui descriere este
necesar referirea la el nsui se
numete algoritm recursiv. Aceast
clas de algoritmi este ntlnit
frecvent.
z Recursivitatea face posibil
prezentarea unor descrieri simple i
elegante ale operaiilor algoritmului.
z Subprogramele recursive, dei
simple, necesit costuri manifestate
n consum de resurse (timp,
memorie).

http://upload.wikimedia.org/wikipedia/commons/f/f7/RecursiveTree.JPG
Algoritmi recursivi / Funcii recursive - 1

z Caracteristica esenial a unei definiii


recursive pentru algoritmul A const n
referirea lui A n descrierea acestuia.
z Valoarea funciei A trebuie s fie ori direct
calculabil ori calculabil* cu ajutorul unor
valori direct calculabile.
z O definiie recursiv poate fi interpretat ca
definind o ecuaie cu diferene, pentru care
valorile direct calculabile reprezint condiii
iniiale. Metodele de calcul cu diferene sunt
de tip ascendent sau de tip descendent.
*Prin calculabilitate nelegem caracteristica de a putea fi calculat (evaluat)
folosind un algoritm
**http://www.ccs.neu.edu/home/fell/COM1201/PROGRAMS/RecursiveFractals.html
***http://lcni.uoregon.edu/~mark/Geek_art/Binary_fractals/Binary_fractal_images.html
**http://people.cs.uchicago.edu/~kaharris/15100/lab7/lab7.html
*http://www.codeproject.com/KB/cpp/Recursion_Prmr_CPP_01.aspx?msg=2519016
Algoritmi recursivi / Funcii recursive - 2

z (Calculul factorialului) Fact(n) := n*Fact(n-1)


pentru nN* cu condiia Fact(0) := 1.
z (Funcia Fibonacci) Fib(n) := Fib(n-2) + Fib(n-1)
dac n2 cu condiiile iniiale Fib(0) := 1 i
Fib(1) := 0.
z (Funcia Ackermann*) Ac: NxN N,
Ac(m,n):=Ac(m-1, Ac(m,n-1)) dac m>0 i n>0;
Ac(m,0):= Ac(m-1,1) dac m>1; Ac(0,n):= n+1
pentru oricare n.
*Aceast funcie a fost descris de ctre David Hilbert (1862-1943: 1923) cu doi ani nainte ca
studentul su Wilhelm Ackermann (1925) s fi publicat demonstraia unui rezultat foarte
important privind acest funcie.

http://en.wikipedia.org/wiki/Fibonacci; http://en.wikipedia.org/wiki/David_Hilbert
Funcii recursive pentru calculul factorialului 2a
Recursivitate binar, recursivitate
mutual/indirect (studiu: n timpul apelului) 2b
Recursivitate imbricat (nested) 2c
Algoritmi recursivi / Funcii recursive - 3

z (Funcia Manna-Pnueli) MP: NN,


MP(x):= x-1 dac x>11. Dac x<12
atunci MP(x):=MP(MP(x+2)).
z (Funcia D) D: NN, D(0):=1;
D(x):=2*D(x-1) dac x este numr
natural nenul.
z (Funcia Sum) Sum : N N, Sum(0):=0;
Sum(x):= x mod 10 + Sum(x div 10)
dac x>0.
Algoritmi recursivi / Funcii recursive - 4

z (Sisteme de funcii - recursie simultan recursie indirect):


Pentru un algoritm recursiv descris cu ajutorul a dou funcii,
acestea au urmtoarea form: F1(x) este definit recursiv folosind
F1(x) i F2(x); F2(x) este definit recursiv folosind F2(x) i F1(x).
z Exemplul 1: Definiia funciei cmmdc (cel mai mare divizor
comun) poate fi prezentat prin urmtoarele reguli:
cmmdc(a,b) := a dac b = 0;
cmmdc(a,b) := cmmdc(a, modulo(a,b)) dac b > 0.
modulo(a,b) := a dac a<b;
modulo(a,b) := modulo(a-b, b) dac ab.

Exemplul 2:

http://en.wikipedia.org/wiki/Recursion_%28computer_science%29
Implementarea algoritmilor recursivi n limbajele de
programare limbajul C: Exemple comentate

Marius Minea, Programarea calculatoarelor, 2009:


http://www.cs.utt.ro/~marius/curs/pc/curs2_6.pdf;
Marius Minea, Utilizarea i programarea calculatoarelor, 2005:
http://www.cs.utt.ro/~marius/curs/upc/curs15.pdf
Exemplu: Metoda inseriei binare
Alte exemple simple

http://andrei.clubcisco.ro/cursuri/1pc/co/curs12.pdf

http://www.cs.utah.edu/plt/slideshow/cs3520-f02-slides/lecture22.pdf

De vazut: http://plato.stanford.edu/entries/recursive-functions/
Metoda Divide et impera - Principiul
Metoda Divide et impera Exemple

Sortare prin
interclasare

Grigore Albeanu, Luminita Radu, Luminita Rapeanu, Alexandru Averian. Tehnici de programare. Romania de Maine, 2003.
Limbaje nerecursive

z FORTRAN, BASIC, COBOL limbaje


nerecursive;
z Este necesar ca definiiile recursive s fie
implementate iterativ )metoda stivei, metoda
tabelelor).

http://www.ibiblio.org/pub/languages/fortran/ch1-12.html
Eliminarea recursivitii
z Modalitile n care se elaboreaz algoritmii
nerecursivi (iterativi) asociai definiiilor
recursive sunt: metoda stivei, metoda tabelelor
i metoda parcurgerii arborelui asociat.
z Metoda stivei simuleaz tratarea
recursivitii de ctre compilator.
z Metoda tabelelor construiete soluia
ascendent sau descendent, n funcie de
varianta aleas.
z Metoda arborelui asociat (exemplu: arbori de
puteri pentru calcul xn).
Metoda stivei: Funciile AC i MP

Algoritmul AC1
Metoda tabelrii AC- precizri
z Complexitatea mare a algoritmului Ac1 este datorat
faptului c se calculeaz repetat anumite valori.
z Studiind definiia funciei Ac observm c irurile
A(m,.) pentru m = 0, 2, ... sunt din ce n ce mai
rarefiate, fiecare - cu excepia primului, fiind un subir
al irului precedent. Pentru clarificare prezentm
nceputul subirurilor A(m,.) pentru m = 0, 1, 2, 3 i 4.
Metoda tabelelor Ac2
z Pentru a calcula
valorile funciei Ac
este suficient s
utilizm dou
tablouri.
z Algoritmul AC2
evalueaz funcia Ac
prin aceast metod.
z Algoritmul Ac2,
necesit spaiu de
stocare de ordinul
O(m). Timpul de
calcul pentru
determinarea valorii
Ac(m,n) este de
ordinul O(mAc(m,n)).

Algoritmul AC2
Implementarea algoritmilor recursivi
aspecte tehnice aa nu! De ce?

http://andrei.clubcisco.ro/cursuri/1pc/co/curs12.pdf

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