高效的斐波那契數列實現
阿新 • • 發佈:2019-01-02
一般斐波那契數列在教科書中都是以遞迴的形式登場的,所以一般有常規思維是用遞迴解決。
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
斐波那契數列的常用變形,青蛙跳臺階和用格子覆蓋矩形。