Fibonacci number是这样的数列:
f(0) = 0, f(1) = 1,
f(n) = f(n-1) + f(n-2) (n >=2)
下面给出几种求解方法
1) 使用函数递归方法.
这个是最容易想到的方法
long fib1(int k)
{
if(k == 0 || k == 1)
{
return k;
}
else
{
return fib1(k - 1) + fib1(k - 2);
}
}
但是这个比较花时间,因为有很多重复计算(重复的函数调用)。
在我的电脑上,计算f(45)的值,用了10.256秒的时间。
2) 把计算的中间结果保存下来,避免重复计算。
long array[100];
long fib2(int k)
{
if(k == 0 || k == 1)
{
array[k] = k;
}
else
{
if(array[k] == 0)
{
array[k] = fib2(k -1) + fib2(k - 2);
}
}
return array[k];
}
用这种方法计算f(45),仅仅用了 0.000017秒的时间, 时间降低了百万倍!
3) 第二种方法,使用了较多的内存保存中间结果。还可以进一步减少内存的使用。
long _fib3(int k, int last, int last_last)
{
if( k == 0 || k == 1)
{
return last;
}
else
{
return _fib3(k -1, last + last_last, last);
}
}
long fib3(int k)
{
return _fib3(k, 1, 0);
}
所需时间和 2)差不多。
4)不使用函数递归,使用迭代的方法
long fib4(int k)
{
long last_last = 0;
long last = 1;
while(k > 1)
{
long tmp = last_last;
last_last = last;
last += tmp;
k--;
}
return last;
}
5)
long array[100];
long fib5(int k)
{
array[0] = 0;
array[1] = 1;
int i = 1;
while ( i <= k)
{
i++;
array[i] = array[i - 1] + array[i - 2];
}
return array[k];
}
6)
long fib6(int k)
{
if(k < 2)
{
return k;
}
if(k == 2)
{
return 1;
}
int t = k / 2;
int a = fib6(t + 1);
int b = fib6(t);
if(k %2 == 1)
{
return a * a + b * b;
}
else
{
return b * (2 * a -b);
}
}
References:
http://stackoverflow.com/questions/3337455/how-to-generate-fibonacci-faster