Top Banner

of 21

Cursul 02 algoritmi si tehnici de programare

Apr 03, 2018

Download

Documents

Nicolae Stan
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
  • 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