一般斐波那契数列在教科书中都是以递归的形式登场的,所以一般有常规思维是用递归解决。
long long Fibonacci(unsigned int n)//递归实现
{
if (n <= 0)
return 0;
if (1 == n)
return 1;
return Fibonacci(n - 1, n - 2);
}
但递归的效率实际是很低的,在计算数列中,有大量的重复性计算。以这种方式计算的时间复杂度是以指数递增的,。
实用的高效解法,利用循环来解出。复杂度为O(n)。
long long Fibonacci(unsigned int n)
{
int result[2] = { 0, 1 };//将首两项先储存起来
if (n < 2)
return result[n];
long long fibMinus1 = 1;
long long fibMinus2 = 0;
for (unsigned int 2; i <= n; i++)
{
fibN = fibMinus1 + fibMinus2;
fibMinus2 = fibMinus1;
fibMinus1 = fibN;
}
return fibN;
}
更加高效的O(logn)算法,但并不算实用。
就是满足一个归纳的等式。
[ f(n) f(n-1) [ 1 1
f(n-1) f(n-2) ]= 1 0 ] ^n-1
斐波那契数列的常用变形,青蛙跳台阶和用格子覆盖矩形。