Upload
nicolae-stan
View
238
Download
0
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