您的位置:首页 > 其它

Fibonacci数列计算的三种方法

2011-08-22 21:38 411 查看
以下分别用递归,迭代,动态规划求解Fibonacci数列:

#include <iostream>
#include <ctime>
using namespace std;

int Fibonacci_R(int n)
{
if((n == 1)||(n == 2))
return 1;
else
return Fibonacci_R(n-1) + Fibonacci_R(n-2);
}

int Fibonacci_I(int n)
{
int A = 1;
int B = 1;
int C = 2;
int index;
if((n == 1)||(n == 2))
return 1;
for(index = 3; index <= n; ++index)
{
C = A + B;
A = B;
B = C;
}
return C;
}

int Fibonacci_D(int n)
{
int * pCache = new int
; //avoid stack overflow
pCache[0] = 1;
pCache[1] = 1;
for(int i = 2; i<n; ++i)
{
pCache[i] = pCache[i-1] + pCache[i-2];
}
int result = pCache[n-1];
delete [] pCache;
return result;
}

int main()
{
int n = 30;
clock_t begin, end;

begin = clock();
cout<<"Fibonacci_R "<<n<<" = "<<Fibonacci_R(n);
end = clock();
cout<<" time cost is "<<(end-begin)<<" ms"<<endl;

begin = clock();
cout<<"Fibonacci_I "<<n<<" = "<<Fibonacci_I(n);
end = clock();
cout<<" time cost is "<<(end-begin)<<" ms"<<endl;

begin = clock();
cout<<"Fibonacci_D "<<n<<" = "<<Fibonacci_D(n);
end = clock();
cout<<" time cost is "<<(end-begin)<<" ms"<<endl;

return 0;
}


  后来想想,使用数组的方法跟迭代没什么区别,算不上动态规划,修改如下:

#include <iostream>
#include <map>
#include <ctime>

using namespace std;

int Fibonacci_R(int n)
{
if((n == 1)||(n == 2))
return 1;
else
return Fibonacci_R(n-1) + Fibonacci_R(n-2);
}

int Fibonacci_I(int n)
{
int A = 1;
int B = 1;
int C = 2;
int index;
if((n == 1)||(n == 2))
return 1;
for(index = 3; index <= n; ++index)
{
C = A + B;
A = B;
B = C;
}
return C;
}

//int Fibonacci_D(int n)
//{
//    int * pCache = new int
;
//    pCache[0] = 1;
//    pCache[1] = 1;
//    for(int i = 2; i<n; ++i)
//    {
//        pCache[i] = pCache[i-1] + pCache[i-2];
//    }
//    int result = pCache[n-1];
//    delete [] pCache;
//    return result;
//}

int Fibonacci_D(int n, map<int, int> & Cache)
{
map<int, int>::const_iterator iLocator = Cache.find(n);
if(iLocator != Cache.end())
return iLocator->second;
else
Cache.insert(make_pair(n, Fibonacci_D(n - 1, Cache) + Fibonacci_D(n - 2, Cache) ));
iLocator = Cache.find(n);
return iLocator->second;
}

int main()
{
int n = 30;
clock_t begin, end;
map<int, int> Fibonacci_Cache;
Fibonacci_Cache.insert(make_pair(1, 1));
Fibonacci_Cache.insert(make_pair(2, 1));

begin = clock();
cout<<"Fibonacci_R "<<n<<" = "<<Fibonacci_R(n);
end = clock();
cout<<" time cost is "<<(end-begin)<<" ms"<<endl;

begin = clock();
cout<<"Fibonacci_I "<<n<<" = "<<Fibonacci_I(n);
end = clock();
cout<<" time cost is "<<(end-begin)<<" ms"<<endl;

begin = clock();
cout<<"Fibonacci_D "<<n<<" = "<<Fibonacci_D(n, Fibonacci_Cache);
end = clock();
cout<<" time cost is "<<(end-begin)<<" ms"<<endl;

return 0;
}


  当计算数字很大时,迭代速度 > 动态规划(map操作耗费的时间?) >>> 递归。

  

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: