Documente Academic
Documente Profesional
Documente Cultură
Raport
Chișinău 2018
Cuprins
Cuprins ................................................................................................................................................. 2
Scopul și obiectivele lucrării ................................................................................................................ 3
Sarcina .................................................................................................................................................. 4
Mersul lucrării ...................................................................................................................................... 5
Analiza algoritmilor .............................................................................................................................. 8
Concluzii............................................................................................................................................. 10
Anexa A .............................................................................................................................................. 11
Scopul și obiectivele lucrării
În realizarea lucrării de laborator, fiecare pseudocod dat, a fost transformat în cod și scris în C++.
Apoi a fost calculate numărul de iterații pentru fiecare funcție.
1) Metoda recursivă
int fib1(int n)
int k;
if(n<2)
return n;
else
{return fib1(n-1)+fib1(n-2);
k++;
2) Metoda iterativă
int fib2(int n)
int i=1,j=0,k,m=0;
for(k=0;k<n;k++)
j=i+j;
i=j-i;
return j;
}
3) Metoda exponențială
int fib3(int n)
int i=1,j=0,k=0,h=1,g,t;
g=n;
while(n>0)
if(n%2!=0)
t=j*h;
j=i*h+j*k+t;
i=i*k+t;
t=h*h;
h=2*k*h+t;
k=k*k+t;
n=n/2;
return j;
4) Metoda proprie
int fib4(int n)
int i,a=0,j=1,c;
if(n==0)
return a;
for(i=2;i<=n;i++)
{
c=a+j;
a=j;
j=c;
return j;
}
Analiza algoritmilor
Fib(n)
Fib1(n) Fib2(n) Fib3(n) Fib4(n)
n
5 15 10 35 10
10 177 20 70 25
20 21891 40 140 55
Fib1(n)
20000
15000
10000
5000
0
5 10 20
Fib1(n)
În metoda recursivă numărul de iterații a algoritmului cresc exponențial, ceea ce este ineficient pentru
resursele compilatorului.
Numarul de iterații pentru algoritmi
160
140
120
100
80
60
40
20
0
5 10 20
Algoritmul recursiv Fib1, în cazul dat, are nevoie de mai mult timp pentru a executa programul,
precum sînt efectuate mai multe iterații decît în celelalte cazuri. Numarul acestora crește cu mult mai
rapid ca în cazul algoritmilor Fib2, Fib3, Fib4, în care numarul iterațiilor este de cîtevai ori mai mic,
și timpul de execuție este mai rapid.
Concluzii
În realizarea lucrării de laborator, fiecare pseudocod dat, a fost transformat în cod și scris în C++.
Apoi a fost calculate numărul de iterații pentru fiecare funcție.
Algoritmul recursiv Fib1, în cazul dat, are nevoie de mai mult timp pentru a executa programul,
precum sînt efectuate mai multe iterații decît în celelalte cazuri. Numarul acestora crește cu mult mai
rapid ca în cazul algoritmilor Fib2, Fib3, Fib4, în care numarul iterațiilor este de cîtevai ori mai mic,
și timpul de execuție este mai rapid.
În metoda recursivă numărul de iterații a algoritmului cresc exponențial, ceea ce este ineficient
pentru resursele compilatorului.
În urma efectuării acestei lucrări de laborator am aplicat cunoștințele acumulate la orele de curs
referitor la analiza asimptotica a algoritmilor. Pentru fiecare algoritm în parte s-a calculat numărul de
iterații și s-a ajuns la concluzia că metoda recursivă este cea mai ineficientă.
Anexa A
Anexa B
#include <iostream>
int n,k;
int fib1(int n)
k++;
if(n<2)
return n;
else
{return fib1(n-1)+fib1(n-2);
return k;
int fib2(int n)
int i=1,j=0,k,m=0;
for(k=0;k<n;k++)
j=i+j;
i=j-i;
return j;
}
int fib3(int n)
int i=1,j=0,k=0,h=1,g,t;
g=n;
while(n>0)
if(n%2!=0)
t=j*h;
j=i*h+j*k+t;
i=i*k+t;
t=h*h;
h=2*k*h+t;
k=k*k+t;
n=n/2;
return j;
int fib4(int n)
int i,a=0,j=1,c;
if(n==0)
return a;
for(i=2;i<=n;i++)
c=a+j;
a=j;
j=c;
int main()
cout<<endl;
cout<<"Prima metoda:";
cout<<fib1(n)<<endl;
cout<<fib2(n)<<endl;
cout<<fib3(n)<<endl;
cout<<fib4(n)<<endl;
return 0;