Cursul 02 algoritmi si tehnici de programare

Embed Size (px)

Citation preview

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    1/21

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    2/21

    Sumar

    1. Iterativitate i recursivitate

    2. Subprograme recursive

    3. Divide et Impera

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    3/21

    Subprograme iterative

    Algoritmi iterativrepetitiv

    long factorial(int n)

    { int i;

    long p;

    p=1;

    for(i=0; i

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    4/21

    Subprograme recursive

    Recursivitatea este noiune matematic care implicdefinirea unui concept prin referirea la acelai concept.

    Algoritm recursiv - face uz de sine nsui, n modrepetat.

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    5/21

    Subprograme recursive

    Tipuri de recursivitate: Recursivitate simpl (algoritm unirecursiv) apelul

    recursiv are loc o singurdat n funciainvocat.

    Recursivitate multipl (algoritm multirecursiv)

    apelul recursiv se face de dou sau mai multe ori nfunciainvocat.

    Trebuie s existe: Formul de start (una sau mai multe)

    Formul recursiv

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    6/21

    Subprograme recursive

    Exemple

    Numrarea valorilor care ndeplinesc o condiie

    Suma elementelor unui vector

    Algoritmul lui Euclid

    irul lui Fibonacci

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    7/21

    Subprograme recursive

    Orice algoritm iterativ poate fi transcris ntr-un algoritmrecursiv i invers.

    Algoritmul ales depinde de competena/pregtireaprogramatorului.

    Uzual, volumul de munc pentru scrierea algoritmuluirecursiv este mai mic dect n cazul algoritmului iterativ.

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    8/21

    Subprograme recursive

    Construcia subprogramelor recursive S asigure respectarea finititudiniialgoritmului: ieirea

    dup un numr finit de pai

    Condiie de oprire sau a generrii de noi apeluri Aplicarea formulei de start dac e ndeplinit condiia

    Aplicarea formulei recursive n caz contrar

    long factorial(int n)

    {

    if (n == 0) return 1;

    else

    return n * factorial(n-1);

    }

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    9/21

    Subprograme recursive

    Necesarul de memorie

    La fiecare apel se aloc spaiu n stiv pentru x = factorial(5);

    factorial( 5 )factorial(4) * 5

    factorial(0) * 1factorial(1) * 2

    factorial(2) * 3factorial(3) * 4

    120

    62

    11

    24

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    10/21

    Subprograme recursive

    fib(n) = fib(n-1) + fib(n-2),

    fib( 1 ) = fib( 0 ) = 1

    fib( 3 )

    fib( 0 )

    fib( 1 )

    fib( 2 )

    3

    2

    1

    1

    fib( 1 )1

    fib: N N (Fibonacci)1 dac n = 0sau n = 1

    fib(n) =fib(n-2)+fib(n-1) dac n >1

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    11/21

    Subprograme recursive

    Fibonacci iterativ

    long fibo_it (int n)

    {long f1=1,f2=1,fn=1;

    int i;

    if (n==0 || n==1)

    return 1;

    for (i=2;i

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    12/21

    Subprograme recursive

    Cnd alegem subprograme iterative/recursive?

    Consum memorie

    Timp de execuie Uurin n proiectare / implementare Lungime cod surs

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    13/21

    Subprograme recursive

    Consideraii generale Fiecare apel recursiv trebuie aplicat unei probleme mai simple

    dect n pasul anterior

    Rezult o metod simpl de oprire a generrii de noi apeluri

    Cum se transform un subprogram iterativ n unul recursiv?

    1. instruciunea iterativ dispare

    2. condiia de la instruciunea iterativ devine (eventualmodificat) condiie de oprire a generrii de noi autoapeluri

    3. Repetarea este asigurat prin autoapel

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    14/21

    Subprograme recursive - exemple

    Calculul combinrilor de n luate cte k

    long comb(unsigned n, unsigned k)

    {if (k>n) return 0;

    else

    if ((k==0) || (k==n))

    return 1;

    elsereturn comb(n-1,k)+comb(n-1,k-1);

    }

    !!

    !

    knk

    nC

    k

    n1k

    1n

    k

    1n

    k

    nCCC

    10

    nC 1

    k

    k

    C

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    15/21

    Subprograme recursive - exemple

    Suma elementelor unui vector

    S(n) = x[n-1] + S(n-1), S(0) = 0long suma(long v[], int n)

    {

    if( n == 0)

    return 0;

    else

    return v[n-1] + suma(v, n-1);

    }

    Apel:long s;

    s = suma(a,n);

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    16/21

    Subprograme recursive - exemple

    Maximul dintr-un vectorint max(int a[100], int n)

    {int x1;

    if (n==0) return a[n];

    else

    {

    x1=max(a,n-1);

    if (x1>a[n]) return x1;

    else return a[n];

    }

    }

    Apel:int m;

    m = max(a,n-1);

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    17/21

    Subprograme recursive - exemple

    // maxim dintre dou valoriint maxd (int a, int b)

    {

    return a > b ? a:b;

    }

    // maxim dintr-un vectorint maxim (int a[100], int n)

    {

    if (n==1) return a[0];

    else return maxd (maxim (a,n-1), a[n-1]);

    }

    Apel:int m;

    m = max(a,n-1);

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    18/21

    Metoda Divide et Impera

    Divide et Impera este o tehnic special princare se pot rezolva o serie de probleme.

    Principiul care st la baza acestei tehnici este

    urmtorul: se descompune problema n dou sau mai multe

    subprobleme mai simple

    se rezolv subproblemele

    se combin soluiile problemelor n care a fostdescompus i se obine soluia problemei iniiale

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    19/21

    Divide et Impera

    Maximul dintr-un vectorint max1(int a[100], int s, int d){ int x1,x2;

    if (s==d) return a[s];

    else

    {

    x1 = max1(a,s,(s+d)/2);x2 = max1(a,(s+d)/2+1,d);

    if (x1>x2)

    return x1;

    else

    return x2;

    }

    }

    Apel:int m;

    m = max1(a,0,n-1);

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    20/21

    Divide et Impera

    Cautarea binarint cauta(int v[], int p, int u, int k)

    {

    if (p > u)

    return -1;

    else{

    int m = (p + u) / 2;

    if(k < v[m])

    return cauta(v, p, m-1, k);

    else

    if(k > v[m])return cauta(v, m+1, u, k);

    else

    return m;

    }

    }

  • 7/28/2019 Cursul 02 algoritmi si tehnici de programare

    21/21

    Subprograme recursive - teme

    Numrul de elemente negative dintr-unvector

    Produs scalar ntre doi vectori

    Algoritmul lui Euclid Calculul cmmdc*

    Metoda tangentei

    Problema turnurilor din Hanoi* Sortare*

    * Se gsesc n manual