6.Recursivitate_2012

download 6.Recursivitate_2012

of 52

Transcript of 6.Recursivitate_2012

  • 1RECURENTA VERSUS ITERATIE

    Facultatea de Matematica si Informatica,

    Universitatea din Bucuresti

    7 aprilie 2012

  • 2Noiunea de algoritm = notiune primar.Exist descrieri i proprieti:

    Un algoritm const dintr-o mulime finit de pai, fiecare necesitnduna sau mai multe operaii.

    Pentru a fi implementate pe un calculator, ntr-un anumit limbaj deprogramare, aceste operaii trebuie s fie:

    definite;

    efective.

    Caracteristicile algoritmilor

    corectitudinea;

    finititudinea:;

    generalitatea;

    completitudinea;

    claritatea.

    1. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

  • 31. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

    Studiul algoritmilor cuprinde mai multe aspecte (1):Elaborarea algoritmilor.

    Tehnici de elaborare (reguli) + creativitate (intuiie) = soluie

    Exprimarea algoritmilor

    - scheme logice, limbaje de tip pseudocod, programe in diferite

    limbaje de programare.

    - se impune utilizarea unui anumit stil de programare (legat nu de un

    anumit limbaj de programare, ci de tipul limbajului i de modul deabordare)

  • 41. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

    Studiul algoritmilor cuprinde mai multe

    aspecte (2):

    Validarea algoritmilor (demonstrarea

    matematica a corectitudinii, independent de

    implementare).

    Analiza algoritmilor. (in general: timpul de

    calcul i/sau la memoria necesar)

    Testarea programelor :

    (i) depanarea (debugging) Cf. E.W.

    Djikstra, prin depanare putem evidentia

    prezenta erorilor dar nu si absenta lor!

    (ii) verificare (profiling)

  • 51. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

    Incercarea de definire (decada 1930-1940):

    Sunt propuse diverse formalisme pentru

    notiunea de algoritm:

    Functiile -calculabile (Alonzo CHURCH iStephen Cole KLEENE);

    Masinile Turing (Alan TURING);

    Functiile general recursive (Kurt GDEL);

    Sistemele Post, inclusiv masina Post-Turing

    (Emil Leon POST);

    Algoritmii normali Markov (N.N. MARKOV)

    Toate teoriile: echivalente

    Teza Church-Turing (cele 2 variante)

  • 6Lambda calculul

    O -functie este definit de o lambda-expresie careexprim aciunea funciei n argumentele ei.

    Exemple: funcia f(x)=x+2: x. x + 2 .

    numrul f(3): ( x. x+ 2) 3

    1. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

  • 7Masina Turing

    a b a b

    unitate de

    control

    1. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

  • 81. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

  • 9Maina Turing

    Un sistem ( , , Q, q0, F, ) unde:

    este o mulime finit, nevida numit alfabet de intrare;

    este o mulime finit, nevida numit alfabetul benzii;

    , i ;

    Q este o mulime finit, nevida numit mulimea strilormasinii;

    q0 Q este starea iniial;

    F Q este mulimea strilor finale (de acceptare sau derespingere);

    : Q x Q x x { L , R } este funcia de tranziie, unde Ldenota deplasarea la stnga iar R denota deplasarea ladreapta a cursorului masinii.

    1. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

  • 10

    1. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

    Stephan Cole KLEENE: "The Theory of Recursive

    Functions, Approaching its Centennial", Bulletin (New

    Series) of the American Mathematical Society, Vol. 5,

    No. 1, July 1981:

    "prini" teoriei funciilor recursive (inafara lui Kurt Gdel iKleene nsui) sunt considerai a fi:

    Leopold Kronecker, prin conferina inut pe 21 sept. 1886 n faa Der Deutschen Naturforscherversammlung zu Berlin (Asociaia pentru Cercetarea Naturii), cf. H. Weber, Leopold

    Kronecker, Math. Ann. 43 (1893), 1-25

    Julius Wilhelm Richard Dedekind (18311916), prin Teorema 126 ("Satz der Definition durch

    Induktion") din articolul "Was sind und was sollen

    die Zahlen? (Ce sunt i ce ar trebui sa fie numerele)" publicat n 1888 si prin Definitia 71

    (care contine defiinitia axiomatica a N i.e.

    axiomele Dedekind-Peano)

  • 11

    Exemple de functii primitiv recursive:

    a+0 = a

    a+succ(x) = succ(a+x)

    a 0 = 0

    a succ(x) = a x+a

    a 0 = 1

    a succ(x) = a x a

    unde succ(x)=x+1 .

    1. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

  • 12

    Recurenta primitiva

    Fie funciile : g : N n N , h : N n+2 N ;

    se cere s se construiasc funcia

    f : N n+1 N

    care s satisfac urmtoarele dou ecuaii :

    (1) f(a1 ,a2 ,, an ,0) = g(a1 ,a2 ,, an) ,

    (2) f(a1 ,a2 ,, an , x+1) = h(a1 ,a2 ,, an , x , f(a1 ,a2 ,, an , x)) .

    Spunem c f este definit prin recuren primitiv asupra lui x dinfunciile g i h , prin intermediul a n>=0 parametri a1 ,a2 ,, an .

    Convenim ca n cazul n=0 s notm prin g o constant numrnatural.

    1. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

  • 13

    1. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

    Compunerea functionala

    Fie n , m dou numere naturale.

    Se dau m+1 funcii de n argumente:

    h : N m N , g i : Nn N , 1 i m

    Funcia

    f : N n N

    este definit prin compunere funcional din funciile h , g1 , g2 ,, gmdac i numai dac:

    f(x1 ,x2 ,, xn ) = h (g1(x1 ,x2 ,, xn ), g2(x1 ,x2 ,,xn ),,gm(x1 ,x2 ,, xn))

    Un caz particular de compunere functionala:

    subtitutia (m=1)

  • 14

    f(a1 ,a2 ,, an ,0) = g(a1 ,a2 ,, an) ,f(a1 ,a2 ,, an , x+1) = h(a1 ,a2 ,, an , x , f(a1 ,a2 ,, an , x)) .

    f(x1 ,x2 ,, xn ) = h(g1(x1 ,x2 ,, xn ), g2(x1 ,x2 ,,xn ),,gm(x1 ,x2 ,, xn ))

    Exemplul 1:sum(a,x) = a+x,

    => n=1, a1=a

    => sum (a,0) = a+0 = a => g(a) = a = p1(1)(a) ,

    sum(a,x+1)=a+(x+1)=(a+x)+1

    =>h(a,x,y)=succ(sum(a,x))=succ(p3(3)(a,x,sum(a,x))).

    => sum(a,0)=p1(1)(a) ,

    sum(a,x+1)=h(a,x,sum(a,x)) , unde h:N3 N , h(a,x,y)=(succ0p3(3))(a,x,y).

    Exemplul 2:|x-y| = max(0,x-y)+max(0,y-x),

    => |x-y|= max(0, P(2)1 (x,y)-P(2) 2(x,y)) + max(0, P (2) 2(x,y)-P(2)1(x,y)).

  • 15

    1. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

    Exemplul 3:

    O funcie general recursiv: funcia Ackermann-Peter:

    int ack(int m, int n)

    {

    if (0==m) return n+1;

    if (0==n) return ack(m-1,1);

    return ack(m-1,ack(m,n-1));

    }

    altfelnmackmack

    nmack

    mn

    nmack

    )),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 a0 ,a1 ,,an , definit priniteraia pur:

    Pentru orice numr natural a exist un index n astfelnct

    an=1

    Verificata pe calculator pana la 20 258 5.764 1018

    .,13

    ,,2/1

    0

    altfela

    paresteadacaaa

    aa

    n

    nnn

  • 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 unse 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 caregenereaza 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

    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; il) {

    max=i; l=length(i);

    }

    cout

  • 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 ca(n): N n N , ca

    (n) (x1 ,x2 ,, xn )=a

    funciile proiecie pi(n): N n N , pi

    (n) (x1 ,x2 ,, xi ,, xn )= xi ,

    unde a , n , m N , 1 i n, 1jn.

  • 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 2N , f(x,y)=x+y

    b) f:N 2N , f(x,y)=x*y

    c) f:N 2N , f(x,y)=xy , (x0=1)

    d) pd:NN , pd(x)=max(0,x-1)

    e) f:N 2N , f(x,y)=max(0,x-y) , (diferena aritmetic)

    f) sg:NN , sg(0)=0 , sg(x)=1, x>0 ,

    g) f:N2N , f(x,y)=|x-y| , (modulul)

    h) sqrt:NN ,

    i) ls,gr,eq:N 2{0,1}, ls(x,y)=1, daca xy, gr(x,y)=0, altfel

    eq(x,y)=1, daca x=y, eq(x,y)=0, altfel

    xxsqrt )(

  • 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:

    u0=u1=1 ,

    un+2=un+1+un.

  • 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, n0}

    begin

    if (n

  • 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 (n1)

    {

    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 x0, x1,, xk N. Numarul natural

    se numeste numrul Gdel asociat irului (x0, x1,,x k) ise noteaz cu .

    Exemple: = 233152 = 600,

    = 21325075 = 2898918

    Definiie:

    Funcia f:Nn+1 N se obine prin recuren ereditar din funciileg : Nn N i h : Nn+2 N dac:

    f(x ,0) = g(x) ,

    f(x ,y+1) = h(x ,y ,) ,

    unde xNn iar desemneaza numarul Gdel asociatsirului f(x,0), ,f(x,y).

    kx

    kpx

    px

    pn ...110

    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 derecurena ereditar.

    Corolar:

    Funcia f: N N, f(n) = un 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 simultanExemplu:

    Considerm ecuaia lui Pell:

    x2-dy2=1, unde x,y N , a>1, d=a2-1.

    Propoziie:

    Perechea (x,y) N 2 este o soluie pentru ecuaia lui Pelldac exist un numr n0 astfel nct

    x = xn , y = yn , unde :

    x0 = 1, y0 = 0 ,

    xn+1 = a.xn + d

    .yn ,

    yn+1 = xn + a.yn , 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 fi : Nn+1 N, (i=1,2) sunt definite prin recuren simultan

    din funciile gi : Nn N i hi : N

    n+3 N (i=1,2) dac

    fi(x,0)=gi(x),

    fi(x,y+1)=hi(x, f1(x,y), f2(x,y)) , (i=1,2).

    Teorem:

    Clasa funciilor primitiv recursive este nchis fa de recurenasimultan.

    Corolar:

    Funciile f1,f2: N N, f1(n) = xn, f2(n)=yn sunt primitiv recursive.

  • 31

    Conceptul de subprogram de 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 moddirect, ca n cazul calculrii factorialului);

    (2) bazate pe funcii (primitiv) recursive de mai multe argumente (ca n cazul calculriicmmdc 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 (recursivitateasimultana, numita si recursivitate indirect), ca in cazul calculariisolutiilor ecuatiei lui Pell: x2-dy2=1, unde x,y N , a>1, d=a2-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 pentrua calcula valoarea curent (recursivitatea ereditara, numita sirecursivitatea neliniar sau n cascad), ca n cazul determinrii unuielement al irului lui Fibonacci dup formula:

    int fibonacci (int n)

    {

    if (n

  • 35

    Un subprogram recursiv trebuie s respecte urmtoarelereguli:

    1. subprogramul trebuie s poat fi executat, cel puin ntr-osituaie, 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 subprogramelorlimbajele 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

    36

    Pentru implementarea recursivitii se folosete o stiv.

    La fiecare apel recursiv al unuisubprogram se salveaz n stiv stareacurent a execuiei sale (adresa derevenire 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 aceiaiidentificatori cu cei ai subprogramului apelant, orice referire la

    aceti identificatori se asociaz ultimului set de variabile alocaten stiv.

    Zona din stiv rmne alocat pe tot parcursul execuieisubprogramului apelat i se dealoc n momentul revenirii nprogramul apelant.

    Stiva nu este gestionat explicit de programator ci de ctrelimbaj.

    La terminarea execuiei subprogramului apelat recursiv sereface 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 destiv, recursivitatea este eficient numai dac numrul deautoapeluri nu este mare, astfel nct s nu se ajung n situaiaumplerii stivei.

    Recursivitatea ofer avantajul unor soluii mai clare pentruprobleme i unei lungimi mai mici a programelor.

    Ea prezint ns dezavantajul unui timp mai mare de execuiei 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 instruciunilermn neschimbate.

    Procedura/funcia va prelucra datele transmise n stiv.

    In cazul unui nou autoapel, se creeaz un nou nivelpentru stiv, n care se depun noile valori.

    Procedura/funcia care s-a autoapelat se reia de lainstruciunea care urmeaz autoapelului i va lucra cuvariabilele (valorile) reinute n stiv n momentulautoapelului, la care se adaug valorile returnate.

    La atingerea unuia dintre cazurile de baz (condiia deoprire), 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 returnatpentru (n-1), prin nmulirea acesteia cu n se obine valoareacorect a factorialului numrului natural n, valoare returnat desubprogram.

    n ambele situaii este satisfcut condiia de oprire.

  • 42

    Algoritmul cutrii binare: un exemplu algoritm proiectat prinaplicarea tehnicii recursivitatii si a metodei divide-et-impera:

    Fie a1, a2, , an un ir ordonat de n numere naturale (nN,n2) si fie x un numar natural, dat . Se cere sa severifice daca numarul x se afla printre elementele sirului.

    Metoda:

    se injumatateste intervalul [[a1, an]] si se caut x n jumtateacea mai apropiat de valoarea acestuia;

    urmeaza divizarea recursiv a acestei jumtii n alte dou jumtimai mici i reluarea procedeului pana la gasirea elementului saupana 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 cautarebinara

    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]

  • 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]

  • 45

    Ridicarea unui numr real x la o putere n natural, xn binare: unalt exemplu algoritm proiectat prin aplicarea tehnicii

    recursivitatii si a metodei divide-et-impera:

    Metoda clasic de ridicare la putere este multiplicarea sa cu el nsuIde 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:

    Se observ cum valorile lui n scad, pn cnd atinge unul dintrecazurile de baz.

    1. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

    impar esten daca , x x4)par esten daca , x x3) x x2) 1 x1) 1-nn22n1 0 xn

    Cazurile care reprezint

    cazurile de baz ale recursivitii.

    Cnd n este par se

    calculeaz mai nti xn-1

    i apoi se multiplic rezultatul cu x.

    Cnd n este impar se

    multiplic x cu el nsui (x2) i apoi rezultatul se ridic recursiv la puterea n/2.

  • 47

    LIMBAJUL BORLAND PASCAL

    {pow1.pas functia putere recursiva }

    function Power(x:real; n :integer): real;

    begin

    if (n=0) then power:=1;

    if (n=1) then power:=x;

    if odd ( n) then

    Power:=Power(x,n-1)*x; {n impar}

    Else Power:=Power(x*x, n/2); {n par}

    end;

    LIMBAJUL C++

    //pow1.cpp functia putere recursiva

    float Power(float x, int x)

    {

    if (n==0) return 1;

    if (n==1) return x;

    if (n&1)

    return Power(x,n-1)*x; //n impar

    else return Power(x*x, n/2); //n par

    }

    impar esten daca , x x4)par esten daca , x x3) x x2) 1 x1) 1-nn22n1 0 xn

  • 48

    1. se definete o stiv i se initializeaz cumulimea vid;

    2. ct timp este ndeplinit condiia decontinuare a recursivitii:3. se execut instruciunile dinainte de

    apel;

    4. se salveaza pe stiv valorile actuale cereprezint argumentele funcieirecursive;

    5. se execut instruciunile funcieirecursive;

    6. se modific argumentele funcieirecursive;

    7. cnd condiia nu mai este indeplinit idac stiva este nevid atunci8. se aduce de pe stiva un set de variabile,

    9. se executa o serie de calcule (cele dedup apelul recursiv) i

    10. se trece la pasul 3.

    11. dac stiva este vid algoritmul se oprete.

    void print_rec()

    {

    int c = getch ();

    if (c!=\n) { print_rec(); printf(%c,c);}

    }

    void print_it ()

    {

    Stack S;

    empty (S);

    int c = getch ();

    while (c!=\n) { push(c); c = getch();}

    while (nevida(S)) {c=pop (S);

    printf (%c,c);}}

    1. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

    Pentru a tranforma o funcie recursiv ntr-o funcie iterativ:

  • 49

    Exista o legatura stransa intrerecursivitate si structurile de date de tip stiva, arbore, etc folosite in limbajele Borland Pascal si C++ pentru reprezentarea functiilor / procedurilor recursive (insasidefinitia stivelor, arborilor, listelorrealizandu-se recursiv).

    Deseori, variantele iterative necesita folosirea explicita a structurii de tip stiva, generandastfel un cod extrem de laborios. In aceste situatii se considerasolutia recursiva mai eleganta, datorita simplitatii sale.

    Recursivitatea trebuie inlocuitaprin iteratie atunci candrecursivitatea este prea adancasau cand limbajul de programarenu permite implementarea de apeluri recursive.

    Din punctul de vedere al memorieisolicitate, o varianta recursivanecesita un spatiu de stivasuplimentar pentru fiecare apelfata de varianta iterativa.

    Dimensiunea stivei trebuie aleasaastfel incat sa poata permitememorarea elementelor pentrutoate iteratiile.

    1. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

    Avantajele si dezavantajele utilizarii subprogramelor recursive

  • 50

    Greseli tipice in realizarea subprogramelor recursive (1):

    1. Declararea ca variabile globale a unor variabile care

    controleaza adresa de revenire (cazul cand apelurile se

    fac din interiorul unei structuri repetitive).

    2. Declararea ca parametri transmisi prin valoare sau ca

    variabile locale a unor date structurate (de exemplu de tip

    tablou) micsoreaza semnificativ adancimea acceptata a

    recursivitatii, deoarece memorarea lor necesita un spatiu

    mare de memorie.

    1. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

  • 51

    Greseli tipice in realizarea subprogramelor recursive (2):

    4. Absenta unei conditii de oprire.

    5. Exprimarea unei conditii de oprire in care nu intervin nici

    variabile locale si nici parametrii transmisi prin valoare sau

    prin referinta ai subprogramului.

    6. Marirea dimensiunii problemei prin transmiterea in cadrul

    autoapelurilor a unor parametri actuali care nu tind sa se

    aproprie de valorile impuse prin conditia de oprire.

    7. Neutilizarea directivei forward (limbajul Borland Pascal) in

    cazul declararii unor subprograme indirect recursive

    1. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

  • 52

    1. Algoritmi: generalitati

    2. Algoritmi: modele de calculabilitate

    3. Teoria functiilor recursive

    4. Scheme de recurenta; reduceri

    5. Recuren i iteraie in programare

    BIBLIOGRAFIE1. Rzvan ANDONIE, Ilie GARBACEA: Algoritmi

    fundamentali. O perspectiv C++, Editura Libris, Cluj-Napoca, 1995.

    2. Cristian Sorin CALUDE: Theories of Computational Complexity, Elsevier Science Publ., Amsterdam, 1988.

    3. Richard JOHNSONBAUGH, Marcus SCHAEFER: Algorithms, Pearson Prentice Hall, Upper Saddle River, NJ., 2004.

    4. D. JOYCE: The Dedekind/Peano Axioms, Clark University, posted on January 2005, http://aleph0.clarku.edu/~djoyce/numbers/peano.pdf

    5. Dexter C. KOZEN: Theory of Computation, Springer-Verlag, Berlin Heidelberg, 2006.