- (n≧2)
递归算法的原理与局限性:
递归:https://blog.csdn.net/qq_40479037/article/details/87601397
上代码:
# include<iostream>
# include<algorithm>
const int MAX_N = 10000;
using namespace std;
//斐波拉切数列定义
unsigned long long fib0(int n){
//时间复杂度来源于要重复计算
if(n <= 1)
return n;
return fib0(n-1)+fib0(n-2);
}
//记忆搜索
unsigned long long memo[MAX_N+1];
int fib1(int n){//最多算到46,实质上还是指数阶
if(n <= 1) return n;//前两项
//此时有未计算和已经计算好存储到数组中的两种情况
//因为等于0的情况在斐波拉切数列中只有第一项
if(memo[n] != 0) return memo[n];
return memo[n] = fib1(n-1)+fib1(n-2);
}
//指数阶化函数阶
long long fib2(int n){
if(n <= 1)
return 1;
long long first = 0,second = 1,third = 0;
for(int i = 2;i <= n;++i)
{
third = first + second;
first = second;
second = third;
}
return third;
}
int main()
{
int n;
cin >> n;
cout << "fib1:" << fib1(n) << endl;
cout << "fib2:" << fib2(n) << endl;
cout << "fib0:";
cout << fib0(n) << endl;
return 0;
}
运行一下就会发现fib0的时间远比前两种长
相比fib1函数,它的冗余时间来源于重复计算
而对于fib2函数,它的时间浪费在算法本身
如果fib1和fib2做个比较,就会发现fib2性能更为优秀,因为fib1还是未脱离递归调用