斐波那契数列的递推关系如下:
F(n)=F(n-1)+F(n-2) 当 n=1和n=2时,F(1)=F(2)=1.
所以容易得出斐波那契的递归实现:
int fab(int n){
if(n==1||n==2){
return 1;
}else{
return fab(n-2)+fab(n-1);
}
}
由于递归的效率比较低;其实现流程大概是这样的:
要求n=5的情况:
fab(5)--->fab(4)+fab(3);
fab(4)--->fab(3)+fab(2);
fab(3)--->fab(2)+fab(1); 注意这边的3是fab(4)所要求的fab(3),并非fab(5)求的那个fab(3);
fab(2)==fab(1)==1;
fab(3)==2;
fab(2)==1; 这边的fab(2)是fab(4)屁股后面的那个fab(2);
fab(4)==fab(3)+fab(2)==3;
接着求fab(5)的fab(3);
fab(3)------>fab(2)+fab(1);
fab(2)==fab(1)==1;
fab(3)==fab(1)+fab(2)=2;
fab(5)==fab(4)+fab(3)==5;
可以看出,递归是以找到谷底再回溯上来的一种方式进行的,并且用过2次的相同的值不会记录,如fab(3)被计算了2次;效率很低。
循环迭代的实现方法会比递归效率高:
int fab(int n){
int f1,f2=1;
int f3=0;
if(n==1||n==2){
return 1;
}else{
for(int i=0;i<n-2;i++){
f3=f1+f2;
f1=f2;
f2=f3;
}
return f3;
}
}
猜想:
由于F(n)=F(n-1)+F(n-2); 想象一下,如果F(n)=2*F(n-1),那么F(n)=2^n,这边F(n-2)比F(n-1)小,假设有个1<a<2,使F(n)=a^n为斐波那契数列;
代入得 a^n=a^(n-1)+a^(n-2);
a^2=a+1;
解得 a1=(1+sqrt(5))/2 ,a2=(1-sqrt(5))/2 ; sqrt为根号
a1,a2为2个不同的解 ,所以这个递推公式可以写成 F(n)=b1*(a1)^n+b2*(a2)^n
将F(1)=1,F(2)=1代入得
c1*(1+sqrt(5))/2+c2*(1-sqrt(5))/2=1
c1*((1+sqrt(2))/2)^2+c2*((1-sqrt(5))/2)^2=1
解得 c1=1/(sqrt(5)) c2=-1/(sqrt(5));
所以F(n)通式为: F(n)=(1/sqrt(5))((1+sqrt(5))2)^n-(1/sqrt(5))((1-sqrt(5))/2)^n;
看着恐怖,其实就是 (1/√5)[(1+√5)/2]^n-(1/√5)[(1-√5)/2]^n;