斐波拉契数列相信大家都不陌生,是这样一个数列:0,1,1,2,3,5,7......其递推公式为f(n)=f(n-1)+f(n-2),(n>=2)。由于递推公式的存在,于是大家就立即想到使用递归来写,一股脑码下如下代码:
int fi(int n){
if(n==0){
return 0;
}else if(n==1){
return 1;
}else{
return fi(n-1)+f(n-2);
}
}
这段代码一看还是非常简洁易懂的,但是这样的代码只有在当n值比较小的时候才是可行的,当n比较大的时候,由于时间复杂度太大,这个算法是不可行的,递归式的算法时间复杂度为O(2^n)。例如当n达到50的时候运行时间就已经达到了秒数级了。那么有没有什么高效一点的算法呢。
1、使用循环代替递归
int fi(int n) {
if (n == 0) {
return 0;
}
else if (n == 1) {
return 1;
}
else
{
int f0 = 0;
int f1 = 1;
int f2 = 0;
for (int i = 2; i <= n; i++) {
f2 = f0 + f1;
f0 = f1;
f1 = f2;
}
return f2;
}
}
循环算法的时间复杂度为O(n)。
2、使用动态规划求解
int fi(int n){
int *a=n