Sunteți pe pagina 1din 10

Ce sunt

Subprogramele recursive ?
S nvm inteligent

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

n=
f(3)=




f(2)=2*f(1)
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;
var n:integer;
begin
write(n=) ; readln(n );
writeln (n,!=,f(n));
end.
3
3*f(2)
apel recursiv 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
f(1)=1*f(0)
f(0) =1
=1
=2
=6
Recursiv i iterativ
S relum funcia factorial n varianta
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;
recursiv iterativ
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; { cte numere tiprim }
procedure p(i:integer); { procedura p cu parametrul i }
begin
if i=n then write(n) { rezolvarea direct (condiia de STOP) }
else begin
write(i,' '); { Subproblema p(i): tiprim i }
p(i+1); { trecem la subproblema p(i+1) }
end;
end;
begin
write('n='); readln(n); { citim valoarea lui n}
p(1); { apelul iniial }
readln;
end.
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 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

End
A elaborat:Bivol Elena Profesor:Buimistru Sergiu

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