Sunteți pe pagina 1din 14

Ce sunt

Subprogramele recursive ?

S nvm inteligent
S ne amintim
Ce este un subprogram ?
Care sunt avantajele folosirii subprogramelor ?
Ce sunt parametrii unui subprogram ?
Care sunt metodele de transfer al
parametrilor ?
Ce nseamn apelul unui subprogram ?
Care sunt clasele de variabile folosite ntr-un
program ?
Ce vom nva
Ce este recursivitatea ?
Recursivitatea este un concept matematic care implic
definirea unui concept prin referirea la acelai concept.
Astfel, mulimea numerelor naturale se poate defini:
1 este numr natural
orice succesor al unui numr natural este de asemenea un
numr natural
n definiia de mai sus, observm c avem o valoare
iniial (1), iar restul valorilor se obin adunnd 1 la
valoarea anterioar
Definiii recursive


Funcia factorial
Funcia factorial este scris dup definiia
recursiv:
int f(int n) int main()
{ { int n;
if (n==0) return 1; cout<<n=; cin>>n ;
else return n*f(n-1); cout << n <<! = <<f(n));
} }

apel recursiv apel iniial


- fiecare apel adaug un context
n= 3
nou n stiv
f(3)= 3*f(2) =6
- apelurile recursive se termin
f(2)=2*f(1) =2
cnd ajungem la rezolvarea
f(1)=1*f(0) =1 direct
f(0) =1 - la revenirea din apelul recursiv se
golete stiva
S relumRecursiv initerativ
funcia factorial varianta
recursiv iterativ

int f (int n) int f (int n)


{ { int i,P=1;
if (n==0) return 1; for (i=1; i<= n; i++) P=P*i;
else return n*f(n-1); return P;
} }

Ce diferene observai ?
Ce parametri apar n antet ?
Ce variabile locale sunt declarate ?
Ce instruciuni se folosesc ?
O procedur recursiv
Cum afim numerele naturale de la 1 la n printr-o
procedur recursiv ?
Rezolvare: n acest caz, nu avem o formul de
recuren pentru scrierea unui subprogram recursiv.
Pentru a rezolva problema o descompunem n mai
multe subprobleme de acelai tip:
Subproblema p(i): pentru valoarea i a parametrului
vom tipri i dup care apelm (recursiv) p pentru i+1
Apelul iniial este p(1) : ncepem cu 1
Condiia de oprire este s ajungem la n, cnd tiprim
doar n fr alte apeluri
Lista primelor n numere
naturale
int n ; // cte numere tiprim
void p(int i) // procedura p cu parametrul i
{
if (i==n) cout<<n ; // rezolvarea direct (condiia de STOP)
else {
cout<<i<<' '; // Subproblema p(i): tiprim i
p(i+1); // trecem la subproblema p(i+1)
}
}
int main()
{ cout<<n=; cin>>n; // citim valoarea lui n
p(1); // apelul iniial
}
Ce este un subprogram
Un subprogramrecursiv ?
recursiv se caracterizeaz prin
proprietatea c se auto-apeleaz, adic din interiorul lui se
apeleaz pe el nsui. Din afara subprogramului facem un
prim apel al acestuia, dup care subprogranul se auto-
apeleaz de un anumit numr de ori: la fiecare nou auto-
apelare a subprogramului, se execut din nou secvena de
instruciuni ce reprezint corpul su, eventual cu alte date,
crendu-se un aa-numit lan de auto-apeluri recursive.
Putem spune c un subprogram recursiv are acelai efect
ca i un ciclu: repet execuia unei anumite secvene de
instruciuni. Dar, la fel ca n cazul unui ciclu, este necesar
ca repetarea s nu aib loc la infinit. De aceea n corpul
subprogramului trebuie s existe cel puin o testare a unei
condiii de oprire, la ndeplinirea creia se ntrerupe lanul
de auto-apeluri.
Cum scriem un subprogram recursiv ?
1. Trebuie s formulm problema n termeni recursivi
- stabilim formula de recuren
- identificm soluia n cazul rezolvrii directe, dat
de obicei sub forma condiiilor iniiale
- formulm subproblemele de rezolvat n cazul n care
nu dispunem de o formul de recuren
2. Scriem subprogramul recursiv:
- soluia direct se scrie sub forma condiiei de oprire
- apelul recursiv rezult din formula de recuren
- la fiecare apel problema parial trebuie rezolvat
complet
Rspundei la ntrebri
Rspundei la ntrebri
Ai neles ? ncercai s
rezolvai

S recapitulm
Ce este recursivitatea ?
Cum recunoatem un subprogram recursiv ?
Unde scriem apelul iniial ?
Care este rolul condiiei de oprire ?
Ce diferene de scriere exist ntre versiunea
iterativ i cea recursiv a unui algoritm ?
Cum scriem un subprogram recursiv pentru
care avem o formul de recuren ?
Cum formulm recursiv un subprogram pentru
care nu avem o formul de recuren ?

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