Recursivitate
description
Transcript of Recursivitate
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
Noţiunea de recursivitate din programare derivă din noţiunea matematică cunoscută sub numele de recurenţă.
Exemple de recurenţe matematice
1. 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
2. Ş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>2datorate 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.
Exemple de recurenţe matematice
În programare, recursivitatea se realizează prin autoapelul unui subprogram.
Reguli fundamentale
1. Trebuie să existe cazuri elementare care se pot rezolva direct
2. Pentru cazurile care nu se pot rezolva direct recursivitatea trebuie să progreseze către un caz elementar
Proiectarea unui algoritm recursiv
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 = 0an = 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 bc.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
altfel CMMDC:=CMMDC(b,a mod b)
Sfârşit dacă
Exemple de proiectare a unor algoritmi recursivi