斐波拉契数列:1,1,2,3,5,8...,可以看到,当n<=2时,有f(n)=1;当n>=3时,有公式:f(n)=f(n-1)+f(n-2)。
求解斐波拉契数列方法如下:
方法一:递归调用方法,每次递归会有大量的计算,效率很低,利用以上写的公式。时间复杂度为O(2^n),空间复杂度为O(n)。
方法二:非递归方法一,循环中也有很多重复的计算,时间复杂度为O(n),空间复杂度为O(1)。
方法三:非递归方法二,也叫备忘录算法,将前两项的计算结果保存起来,没有重复计算,时间复杂度为O(n),空间复杂度为O(1)。
方法四:利用数学公式:时间复杂度为O(1),空间复杂度为O(1)。
以下为代码的实现:
//方法一
int function(int m)
{
if(m<=1)
return m;
else
return function(m-1)+function(m-2);
}
//方法二
int f(int n)
{
int fibArray[1000]={0};
fibArray[0]=0;
fibArray[1]=1;
for (int i=2;i<=n;i++){
fibArray[i]=fibArray[i-1]+fibArray[i-2];
}
int ret=fibArray[n];
delete[] fibArray;
return ret;
}
//方法三
int f(int n)
{
int fibArray[3]={0,1,n};//给fibArray数组赋初值
for (int i=2;i<=n;i++){
fibArray[2]=fibArray[1]+fibArray[0];
fibArray[0]=fibArray[1];
fibArray[1]=fibArray[2];
}
return fibArray[2];
}
//方法四
int f(int n){
return (pow((1+sqrt(5.0))/2,n)-pow((1-sqrt(5.0))/2,n))/sqrt(5.0);
}