Documente Academic
Documente Profesional
Documente Cultură
Recusivitate 7apr12
Recusivitate 7apr12
=
= +
=
altfel n m ack m ack
n m ack
m n
n m ack
)), 1 , ( , 1 (
0 ), 1 , 1 (
0 , 1
) , (
16
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Exemplul 4 (Conjectura lui Collatz, 1937)
Se d irul de numere a
0
,a
1
,,a
n
, definit prin
iteraia pur:
Pentru orice numr natural a exist un index n astfel
nct
a
n
=1
Verificata pe calculator pana la 20 258 5.764 1018
+
=
=
+
. , 1 3
, , 2 /
1
0
altfel a
par este a daca a
a
a a
n
n n
n
17
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Functia lui COLLATZ :
este definita prin:
f(n)= n/2, daca n este par,
f(n)= 3*n+1, daca n este impar
i are urmatoarele propretati:
lungimea secventei de numere generata in vederea atingerii valorii 1 un
se poate calcula pintr-o formula bazata pe datele de intrare
tinde catre 1.
Se cere sa se scrie un program care sa citeasca o pereche de valori naturale nenule,
reprezentand primul si ultimul numar intr-o secventa inchisa de numere naturale.
Pentru fiecare astfel de secventa inchisa, se cere sa se deteremine valoarea care
genereaza cea mai lunga serie cu functia de mai sus, inainte de a ajunge la 1.
Cea mai mare valoare din secventa si din sirul transformarilor nu va depasi tipul long.
http://gfredericks.com/math/Arith/collatzPage.html
18
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
#include <iostream.h>
long int length (long int n)
{
long int aux=1;
if (n%2) n=n*3+1; else n/=2;
while(n-1){
if (n%2) n=n*3+1; else n/=2;
aux++;
}
return aux;
}
void main ()
{
long int n,m,max,l,i;
cin>>n>>m; max=0; l=-1;
for (i=n; i<=m; i++)
if (length(i)>l) {
max=i; l=length(i);
}
cout<<"intre "<<n<<" si "<<m<<" ,"<<max<<" are lungimea maxima"<<l<<endl;
}
Intre 1 si 20 , numarul 18 are ofera lungimea maxima: 20
19
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Mulimea funciilor de baz
este format din:
funcia succesor succ : N N , succ(x)=x+1
funciile constante c
a
(n)
: N
n
N , c
a
(n)
(x
1
,x
2
,, x
n
)=a
funciile proiecie p
i
(n)
: N
n
N , p
i
(n)
(x
1
,x
2
,, x
i
,, x
n
)= x
i
,
unde a , n , m e N , 1 s i s n, 1sjsn.
20
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Clasa funciilor primitiv recursive
este cea mai mic familie de funcii f : N
n
N , n>=1,
care
conine mulimea funciilor de baz i
este nchis fa de operaiile de
compunere funcional i
recuren primitiv.
Dedekind (1888) i Peano (1889),
Skolem: (1923),
Gdel (1931),
Peter (1934).
21
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Urmtoarele funcii si predicate sunt primitiv recursive:
a) f:N
2
N , f(x,y)=x+y
b) f:N
2
N , f(x,y)=x*y
c) f:N
2
N , f(x,y)=xy , (x
0
=1)
d) pd:NN , pd(x)=max(0,x-1)
e) f:N
2
N , f(x,y)=max(0,x-y) , (diferena aritmetic)
f) sg:NN , sg(0)=0 , sg(x)=1, x>0 ,
g) f:N
2
N , f(x,y)=|x-y| , (modulul)
h) sqrt:NN ,
i) ls,gr,eq:N
2
{0,1}, ls(x,y)=1, daca x<y, ls(x,y)= 0, altfel
gr(x,y)=1, daca x>y, gr(x,y)=0, altfel
eq(x,y)=1, daca x=y, eq(x,y)=0, altfel
| | x x sqrt = ) (
22
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Scheme de recuren speciale:
recurena ereditar
recurena simultan
23
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Schema de recuren ereditar
Exemplu:
Considerm irul lui Fibonacci:
u
0
=u
1
=1 ,
u
n+2
=u
n+1
+u
n
.
24
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Limbajul Borland Pascal
{fib1.pas : implementarea rec. }
function Fib (n: integer): integer;
{returneaza al n-lea termen din
sirul lui Fibonacci, n>0}
begin
if (n<=1) then Fib := n
else Fib:=Fib(n-1)+Fib(n-2);
end;
Limbajul C/C++
//fib1.cpp : implementarea rec.
long Fib (long n)
// returneaza al n-lea termen al
sirului lui Fibonacci, n>0
{
if (n<=1) return n;
else return Fib (n-1) + Fib (n-2);
}
25
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Limbajul Borland Pascal
{fib2.pas: implementarea iterativa}
function Fib (n: integer): integer;
var crt, old, older : integer;
begin
old : = 1; older : = 0;
while (n > 1) do
begin
crt : = old +older;
older : = old;
dec(n)
end;
end;
Limbajul C/C++
// fib2.cpp : implementarea iterativa
long Fib (long n)
{
if (n<=1) return n;
long crt, old=1, older=0;
while(n-- >1)
{
crt = old +older;
older = old;
}
return crt;
}
26
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Definitie
Fie x
0
, x
1
,, x
k
eN. Numarul natural
se numeste numrul Gdel asociat irului (x
0
, x
1
,,x
k
) i
se noteaz cu <x
0
,x
1
,,x
k
>.
Exemple: <3,1,2> = 2
3
3
1
5
2
= 600,
<1,2,0,5> = 2
1
3
2
5
0
7
5
= 2898918
Definiie:
Funcia f:N
n+1
N se obine prin recuren ereditar din funciile
g : N
n
N i h : N
n+2
N dac:
f(x ,0) = g(x) ,
f(x ,y+1) = h(x ,y ,<f(x ,0) ,, f(x ,y)>) ,
unde xeN
n
iar <> desemneaza numarul Gdel asociat
sirului f(x,0), ,f(x,y).
k
x
k
p
x
p
x
p n = ...
1
1
0
0
27
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Teorem:
Clasa funciilor primitiv recursive este nchis fa de
recurena ereditar.
Corolar:
Funcia f: N N, f(n) = u
n
este primitiv recursiv.
28
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Schema de recuren simultan
Exemplu:
Considerm ecuaia lui Pell:
x
2
-dy
2
=1, unde x,y e N , a>1, d=a
2
-1.
Propoziie:
Perechea (x,y)e N
2
este o soluie pentru ecuaia lui Pell
dac exist un numr n0 astfel nct
x = x
n
, y = y
n
, unde :
x
0
= 1, y
0
= 0 ,
x
n+1
= a
.
x
n
+ d
.
y
n
,
y
n+1
= x
n
+ a
.
y
n
, x> 0 .
29
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
program rec_indirecta;
var a,d,n: integer;
function y (n: integer): integer; forward;
function x (n: integer): integer;
begin
if n=0 then x:=1
else x:=a*x(n-1)+d*y(n-1)
end; {x}
function y (n: integer): integer;
begin
if n=0 then y:=0
else y:=x(n-1)+a*y(n-1)
end; {y}
begin {programul principal}
writeln ('dati constanta a > 1 si ordinul solutie n = '); readln (a,n);
d := a *a - 1;
writeln ('perechea de solutii de ordinul ',n,' este: (',x(n):4,' , ',y(n):4,').');
readln;
end.
30
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Definiie:
Funciile f
i
: N
n+1
N, (i=1,2) sunt definite prin recuren simultan
din funciile g
i
: N
n
N i h
i
: N
n+3
N (i=1,2) dac
f
i
(x,0)=g
i
(x),
f
i
(x,y+1)=h
i
(x, f
1
(x,y), f
2
(x,y)) , (i=1,2).
Teorem:
Clasa funciilor primitiv recursive este nchis fa de recurena
simultan.
Corolar:
Funciile f
1
,f
2
: N N, f
1
(n) = x
n
, f
2
(n)=y
n
sunt primitiv recursive.
31
Conceptul de subprogramde tip funcie cu apel recursiv.
Forma general a unui subprogram de tip funcie recursiv:
function f()
{
calcul initial;
conditie de oprire;
apel recursiv f();
calcul final;
return rezultat;
}
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
32
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Tipuri de subprograme recursive
(1) bazate pe funcii (primitiv) recursive unare, (funcia se apeleaz pe ea nsi n mod
direct, ca n cazul calculrii factorialului);
(2) bazate pe funcii (primitiv) recursive de mai multe argumente (ca n cazul calculrii
cmmdc pentru dou numere naturale);
acestea sunt cunoscute sub numele de recursivitate liniar direct:
int cmmdc1 (int x, int y)
{ if (x==y) return x;
else
if (x>y) return cmmdc1(x-y, y);
else return cmmdc1(x, y-x);
}
int cmmdc2 (int x, int y)
{if (0==y) return x;
else
return cmmdc2(y, x%y);
}
33
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
(3) bazate pe funcii care se apeleaz una pe alta (recursivitatea
simultana, numita si recursivitate indirect), ca in cazul calcularii
solutiilor ecuatiei lui Pell: x
2
-dy
2
=1, unde x,y e N , a>1, d=a
2
-1),
int x(int n)
{
if (n==0) return 1;
return a*x(n-1)+d*y(n-1);
}
int y(int n)
{
if (n==0) r eturn 0;
return x(n-1)+a*y(n-1);
}
34
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
(4) bazate pe funcii care au nevoie de mai multe valori anterioare pentru
a calcula valoarea curent (recursivitatea ereditara, numita si
recursivitatea neliniar sau n cascad), ca n cazul determinrii unui
element al irului lui Fibonacci dup formula:
int fibonacci (int n)
{
if (n<=1) return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
35
Un subprogram recursiv trebuie s respecte urmtoarele
reguli:
1. subprogramul trebuie s poat fi executat, cel puin ntr-o
situaie, fr a se autoapela;
2. subprogramul recursiv se va autoapela ntr-un mod n care se
tinde spre ajungerea n situaia de execuie fr autoapel.
Pentru a permite apelarea recursiv a subprogramelor
limbajele de programare dispun de mecanisme speciale
de suspendare a execuiei programului apelant,
de salvare a informaiilor necesare i
de reactivare a programului suspendat.
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
3
6
Pentru implementarea recursivitii
se folosete o stiv.
La fiecare apel recursiv al unui
subprogram se salveaz n stiv starea
curent a execuiei sale (adresa de
revenire i contextul programului).
Stiva implicita = zona de memorie
n care se poate face salvarea
temporar a unor valori, organizat
dup principiul LIFO
Adresa de revenire = adresa
instruciunii cu care va continua
programul ntrerupt la reluarea
execuiei sale
Context = valorile variabilelor locale
subprogramului, valorile parametrilor
de tip valoare i adresele parametrilor
de tip referin
37
Dei variabilele locale ale subprogramului apelat au aceiai
identificatori cu cei ai subprogramului apelant, orice referire la
aceti identificatori se asociaz ultimului set de variabile alocate
n stiv.
Zona din stiv rmne alocat pe tot parcursul execuiei
subprogramului apelat i se dealoc n momentul revenirii n
programul apelant.
Stiva nu este gestionat explicit de programator ci de ctre
limbaj.
La terminarea execuiei subprogramului apelat recursiv se
reface contextul programului din care s-a fcut apelul.
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
38
Datorit faptului c la fiecare autoapel se ocup o zon de
stiv, recursivitatea este eficient numai dac numrul de
autoapeluri nu este mare, astfel nct s nu se ajung n situaia
umplerii stivei.
Recursivitatea ofer avantajul unor soluii mai clare pentru
probleme i unei lungimi mai mici a programelor.
Ea prezint ns dezavantajul unui timp mai mare de execuie
i a unui spaiu de memorie ocupat mai mare.
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
39
Ce se ntmpl la autoapelul funciei/procedurii?
Prin autoapelul funciei/ procedurii instruciunile
rmn neschimbate.
Procedura/funcia va prelucra datele transmise n stiv.
In cazul unui nou autoapel, se creeaz un nou nivel
pentru stiv, n care se depun noile valori.
Procedura/funcia care s-a autoapelat se reia de la
instruciunea care urmeaz autoapelului i va lucra cu
variabilele (valorile) reinute n stiv n momentul
autoapelului, la care se adaug valorile returnate.
La atingerea unuia dintre cazurile de baz (condiia de
oprire), urmeaz s se revin din autoapelri.
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
40
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Demonstrarea corectitudinii algoritmilor recursivi:
se face intr-un mod similar demonstrarii corectitudinii
algoritmilor nerecursivi;
este mult simplificat de forma algoritmului (care permite
utilizarea comod a metodei induciei matematice
complete):
se verific mai nti dac toate cazurile particulare (de
terminare a apelului recursiv) funcioneaz corect;
se trece apoi la o verificare formal, prin inducie, a
funciei recursive corespunztoare, pentru restul cazurilor.
41
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Exemplificare: calculul factorialului unui numr
int factorial (int n)
{
if (0==n) return 1;
return n*factorial(n-1);
}
Demonstrarea corectitudinii: doi pasi:
pentru n = 0, valoarea 1 returnat de program este corect;
dac n>1 atunci, presupunnd corect valoarea returnat
pentru (n-1), prin nmulirea acesteia cu n se obine valoarea
corect a factorialului numrului natural n, valoare returnat de
subprogram.
n ambele situaii este satisfcut condiia de oprire.
42
Algoritmul cutrii binare: un exemplu algoritm proiectat prin
aplicarea tehnicii recursivitatii si a metodei divide-et-impera:
Fie a
1
, a
2
, , a
n
un ir ordonat de n numere naturale (neN,
n2) si fie x un numar natural, dat . Se cere sa se
verifice daca numarul x se afla printre elementele sirului.
Metoda:
se injumatateste intervalul [[a
1
, a
n
]] si se caut x n jumtatea
cea mai apropiat de valoarea acestuia;
urmeaza divizarea recursiv a acestei jumtii n alte dou jumti
mai mici i reluarea procedeului pana la gasirea elementului sau
pana cand domeniul cautarii devine vid.
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
43
LIMBAJUL C++
// bs.cpp: algoritmul recursiv de cautare
binara
int BinarySearch (float *arr, int n, float x,
int btm, int top)
{
if ( top>=btm )
{ int mid=(top+btm)/2;
if (arr[mid]==x)
return mid; //cautare cu succes
if (arr[mid]<x)
btm=mid+1;
else top=mid-1;
return BinarySearch(arr, n, x, btm, top) ;
}
else return -1; //nu s-a gasit valoarea
cautata
}
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
Cu ajutorul acestor cazuri se va ti dac valoarea cutat n
ir s-a gsit sau nu i se poate returna rezultatul imediat.
Observam respectarea regulilor descrise mai sus:
1. Cazul de baz.
Undeva n funcia recursiv, exist unul sau mai multe
teste prin care se verific conditiile de ieire din autoapelul
recusiv. Aceste teste de ieire se numesc cazuri de baz..
Variabilele top i btm sunt prelucrate astfel
nct cutarea s se realizeze ntr-o poriune din
ce n ce mai mic a irului, pn cnd unul dintre
cazurile de baz este gsit.
2. Prelucrarea progresiv.
Esena definiiei recursive const n faptul c
pentru rezolvarea cazului n+1 se recurge la cazul
n. In acest fel, celelalte cazuri ale recursivitii,
diferite de cazurile de baz, trebuie rezolvate prin
tratarea lor astfel nct procesul apelului recursiv
s le orienteze ctre unul dintre cazurile de baz.
44
LIMBAJUL BORLAND PASCAL
{ bs.pas: algoritmul recursiv de cautare binara }
function BinarySearch (arr:real; n: integer; x:real;
btm, top:integer) : integer;
var mid : integer;
begin
if (( top>=btm ) then
begin
mid : = (top+btm) div 2;
if (arr[mid] = x) then BinarySearch : = mid;
if (arr[mid]<x) then btm : = mid+1
else top : = mid-1;
BinarySearch:=BinarySearch(arr,n,x,btm, top)
end;
else BinarySearch : = -1;
end;
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
45
Ridicarea unui numr real x la o putere n natural, x
n
binare: un
alt exemplu algoritm proiectat prin aplicarea tehnicii
recursivitatii si a metodei divide-et-impera:
Metoda clasic de ridicare la putere este multiplicarea sa cu el nsuI
de n-1 ori, iar algoritmul este de complexitate O(n).
1. Algoritmi: generalitati
2. Algoritmi: modele de calculabilitate
3. Teoria functiilor recursive
4. Scheme de recurenta; reduceri
5. Recuren i iteraie in programare
46
Tehnica divide-et-impera: se poate obine un algoritm cu complexitate:
O(log(n)).
Strategia se bazeaz pe urmtoarele proprieti ale puterilor ntregi: