1. 程式人生 > >高效的斐波那契數列實現

高效的斐波那契數列實現

一般斐波那契數列在教科書中都是以遞迴的形式登場的,所以一般有常規思維是用遞迴解決。

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

斐波那契數列的常用變形,青蛙跳臺階和用格子覆蓋矩形。