Sunteți pe pagina 1din 16

Ce sunt

Subprogramele recursive ?
NVARE PRIN PROIECTE

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:
function f(n:integer):integer;
begin
if n=0 then f:=1
else f:=n*f(n-1);
end;
apel recursiv
n= 3
f(3)= 3*f(2) =6
f(2)=2*f(1) =2
f(1)=1*f(0) =1
f(0) =1

var n:integer;
begin
write(n=) ; readln(n );
writeln (n,!=,f(n));
end.
apel iniial
-fiecare apel adaug un context nou
n stiv
-apelurile recursive se termin cnd
ajungem la rezolvarea direct
-la revenirea din apelul recursiv se
golete stiva

Recursiv i iterativ
S relum funcia factorial n varianta
recursiv

iterativ

function f(n:integer):integer;
begin
if n=0 then f:=1
else f:=n*f(n-1);
end;

function f(n:integer):integer;
var i,P: integer;
begin
P:= 1;
for i:=1 to n do P:=P*i;
f:=P;
end;

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

Listarea primelor n numere naturale


program numar;
var n: integer;
procedure p(i:integer);
begin
if i=n then write(n)
else begin
write(i,' ');
p(i+1);
end;
end;
begin
write('n='); readln(n);
p(1);
readln;
end.

{ cte numere tiprim }


{ procedura p cu parametrul i }
{ rezolvarea direct (condiia de STOP) }
{ Subproblema p(i): tiprim i }
{ trecem la subproblema p(i+1) }

{ citim valoarea lui n}


{ apelul iniial }

Ce este un subprogram recursiv ?


Un subprogram 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 autoapeleaz de un anumit numr de ori: la fiecare nou autoapelare 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 ?

Subprograme recursive
Ce am
neles
Know

Ce vreau s
tiu
Wonder

Ce am
nvat
Learn