110 likes | 313 Views
Recursivitate. No ţiunea de recursivitate. O noţiune este definită recursiv dacă în cadrul definiţiei apare noţiunea care se defineşte Ex : un descendent al unei persoane este un copil al său sau un descendent al unui copil al său
E N D
Noţiunea de recursivitate O noţiune este definită recursiv dacă în cadrul definiţiei apare noţiunea care se defineşte Ex: un descendent al unei persoane este un copil al său sau un descendent al unui copil al său Noţiunea de recursivitate din programare derivă din noţiunea matematică cunoscută sub numele de recurenţă.
Exemple de recurenţe matematice • Definiţia numerelor naturale conform axiomelor lui Peano: • 1 este număr natural. • orice succesor al unui număr natural este un număr natural
Exemple de recurenţe matematice Şirul lui Fibonacci Începând cu anul 1202, apare exprimarea şirului: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144 ... conform formulei: f1=1, f2=1, fi= fi-1+ fi-2 pentru i>2 datorate lui Leonardo da Pisa fiul lui Bonaccio (ca urmare a formulării unei probleme privind înmulţirea iepurilor). Primul termen este 0, următorii doi termeni ai şirului sunt 1, iar fiecare termen de după, este egal cu suma ultimilor 2 termeni ce-l preced.
Proiectarea unui algoritm recursiv În programare, recursivitatea se realizează prin autoapelul unui subprogram. Reguli fundamentale Trebuie să existe cazuri elementare care se pot rezolva direct Pentru cazurile care nu se pot rezolva direct recursivitatea trebuie să progreseze către un caz elementar
Exemple de proiectare a unor algoritmi recursivi Ex 1: Să se descrie un subprogram recursiv ce calculează an (a la puterea n), a este un număr real iar n este număr natural. Formula recurentă de calculare a funcţiei putere este: 1 dacă n = 0 an = a * an-1 dacă n ≠ 0
Exemple de proiectare a unor algoritmi recursivi Această formulă se poate rescrie: 1 dacă n = 0 Putere(a,n) = a * Putere(a,n-1)dacă n ≠ 0 Un subprogram recursiv este: Subprogram Putere(a,n) {returnează un număr real} Dacă n = 1 atunci Putere:=1 altfel Putere:=a * Putere(a,n-1) Sfârşit dacă
Exemple de proiectare a unor algoritmi recursivi Ex 2: Să se descrie un subprogram recursiv ce calculează cel mai mare divizor comun a două numere naturale conform algoritmului lui Euclid Dacă formula recurentă nu este dată, aceasta va trebui să fie dedusă pornind de la unul sau mai multe exemple concrete. Fie a = 480 şi b = 220 cele două numere date.
Exemple de proiectare a unor algoritmi recursivi În termeni recursivi putem scrie: c.m.m.d.c.(480,220) = c.m.m.d.c.(220,40) = cmmdc(40,20) = 20 Prin generalizare se obţine: b dacă a divide pe b c.m.m.d.c.(a,b) = c.m.m.d.c.(b,a mod b) dacă a nu divide pe b
Exemple de proiectare a unor algoritmi recursivi Subprogram CMMDC (a , b) Dacă a mod b=0 atunci CMMDC:=b altfelCMMDC:=CMMDC(b,a mod b) Sfârşit dacă