阅读TAOCP中Fibonacci Numbers内容后的想法。
Fibonacci Numbers,形如以下的数列
0,1,1,2,3,5,8,13,21,34, … ,
在这个数列中从第三项开始,每一个元素都是前两个元素的和。
可以写成以下形式:
F0 = 0; F1 = 1; Fn+2 = Fn+1 + Fn , n>=0.
由此我们就可以得到递归代码:
int Fibonacci_Numbers(int n)
{
if(n==0)
return 0;
if(n==1)
return 1;
return Fibonacci_Numbers(n-1)+Fibonacci_Numbers(n-2);
}
int Fibonacci_Numbers(int n)
{
int FibNum[MAXSIZE]={0,1};
for(int i=2;i<=n;++i)
{
FibNum[i]=FibNum[i-1]+FibNum[i-2];
}
return FibNum[n];
}
int Fibonacci_Numbers_Matrix(int n)
{
int FibNumMat[2][2]={1,1,1,0};
int FibNumAns[2][2]={1,1,1,0};
if(n==0)
return 0;
if(n==1||n==2)
return 1;
for(int i=0;i
int Fibonacci_Numbers(int n)
{
int FibNumMat[2][2]={1,1,1,0};
int FibNumAns[2][2]={1,0,0,1};
while(n>0)
{
if(n&1)
Matrix((int *)FibNumAns,(int *)FibNumMat),n--;
else
Matrix((int *)FibNumMat,(int *)FibNumMat),n>>=1;
}
return FibNumAns[0][1];
}
void Matrix(int *Mat1,int *Mat2)
{
int a1=*Mat1,b1=*(Mat1+1),c1=*(Mat1+2),d1=*(Mat1+3);
int a2=*Mat2,b2=*(Mat2+1),c2=*(Mat2+2),d2=*(Mat2+3);
*Mat1=a2*a1+c2*b1;
*(Mat1+1)=b2*a1+d2*b1;
*(Mat1+2)=a2*c1+c2*d1;
*(Mat1+3)=b2*c1+d2*d1;
}