斐波那契數列演算法 JS 實現

wxlworkhard發表於2017-12-27

斐波那契數列的遞推關係定義: enter image description here

根據定義可以得出程式碼:

enter image description here

存在大量重複計算,效率特別低

解法一、遞推關係式的優化

enter image description here

使用閉包快取 cache 物件,儲存計算過的值,以空間換取時間解決效率問題,時間複雜度與空間複雜度都是 O(n)。

解法二、求解通項公式

enter image description here enter image description here

解法三、分治策略

enter image description here

這樣,問題就轉化為如何計算這個矩陣的 n 次方了,可以採用快速冪的方法,快速冪的程式碼如下:

enter image description here

注意 JS 整數的最大安全限制不能做精確計算,可以使用 C 語言做更大範圍的計算,程式碼如下:

enter image description here

將快速冪程式碼中的整型變數 a 變成矩陣,數的乘法變成矩陣乘法,就是矩陣快速冪了:

enter image description here

這裡使用 Sylvester 做矩陣計算,matrix 為需要做 n 次冪計算的矩陣,ans 為單位矩陣,該方法完成了下圖公式的紅框部分

enter image description here

最終程式碼如下:

enter image description here

注意:因為 JS 的最大安全整數的限制,經過測試 n 大於 79 後的值有問題。

相關文章