即使用最普通的方法,从左到右一个个计算,也只需要60次。而你这个递归方法,我大体估计一下需要几亿次。
除非你有 恋
递归癖,否则我想不通你用递归的原因。
顺便说一下,求斐波纳契数列,可以用“
矩阵 {{1,1},{1,0}}”幂,配合“
快速幂算法”,只需要log2(n)次,Google一下就出来了。
当然,60不算大,用矩阵的话,代码就复杂了些。我还是倾向于你使用最朴素的方法,从左到右老实地相加。
另一种作弊的方法就是查表了,一共就60个数。
矩阵法:
程序代码:
#include <stdio.h>
unsigned long long fibonacci( unsigned n )
{
// a *= b
#define MUL(a,b) do {\
unsigned long long t00 = (a##00*b##00+a##01*b##10);\
unsigned long long t01 = (a##00*b##01+a##01*b##11);\
unsigned long long t10 = (a##10*b##00+a##11*b##10);\
unsigned long long t11 = (a##10*b##01+a##11*b##11);\
a##00=t00, a##01=t01, a##10=t10, a##11=t11;\
} while(0)
unsigned long long r00=1,r01=0,r10=0,r11=1;
for( unsigned long long v00=0,v01=1,v10=1,v11=1; n!=0; n/=2 )
{
if( n%2 == 1 )
MUL(r,v); // r*=v
MUL(v,v); // v*=v;
}
return r01;
#undef MUL
}
int main( void )
{
printf( "%llu\n", fibonacci(1) );
printf( "%llu\n", fibonacci(2) );
printf( "%llu\n", fibonacci(3) );
printf( "%llu\n", fibonacci(4) );
printf( "%llu\n", fibonacci(5) );
printf( "%llu\n", fibonacci(6) );
unsigned n;
scanf( "%u", &n );
printf( "%llu\n", fibonacci(n) );
}