Fibonacci数列计算的三种方法
2011-08-22 21:38
411 查看
以下分别用递归,迭代,动态规划求解Fibonacci数列:
后来想想,使用数组的方法跟迭代没什么区别,算不上动态规划,修改如下:
当计算数字很大时,迭代速度 > 动态规划(map操作耗费的时间?) >>> 递归。
#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操作耗费的时间?) >>> 递归。
相关文章推荐
- 三种Fibonacci数列第n项计算方法及其优劣分析
- 二叉树高度的三种计算方法
- Matlab函数运行时间的三种计算方法
- java计算文件大小三种方法以及优缺点比较
- 计算梯度的三种方法: 数值法,解析法,反向传播法
- 三种方法实现Spark计算WordCount
- 对tableView三种计算动态行高方法的分析
- C#计算一段程序运行时间的三种方法
- php判断闰年的三种方法(闰年计算方法)
- 8. 用while循环计算打印2到100的偶数和(三种方法)
- ios三种NSDate计算年月日,以及比较天数的方法
- C#计算一段程序运行时间的三种方法
- 三种方法实现Spark计算WordCount
- Fibonacci数列第n项的第7种计算方法:Python列表
- 三种方法实现Spark计算WordCount
- 三种方法实现Spark计算WordCount
- 对tableView三种计算动态行高方法的分析
- 计算Fibonacci数列第n项的第8种方法(数学推导与Python实现)
- iOS tableView三种计算动态行高方法
- Matlab中计算程序运行时间的三种方法