斐波納契數列的計算是一個很老的話題了,出現在各種算法書中。今天寫這篇博文的出發點是在網上看了MIT 6.00的公開課,正好把一些思路理清一些,畢竟有些東西,自己實踐過後纔有深刻的認識。
普通的遞歸計算
這是最簡單的算法了,根據斐波納契數列的定義就可以得出來:fib(n) = fib(n - 1) + fib(n - 2),具體的代碼如下。(需要說明的是代碼中都省略了對參數的檢查,在實際的代碼中是需要的)。
function fib(n) { return (n === 0 || n === 1) ? 1 : fib(n - 1) + fib(n - 2); }
使用查找表的遞歸計算
普通的遞歸計算會執行很多重複計算,通過查找表就可以獲取到之前已經計算過的fib(k)的值,從而避免重複計算。代碼如下:
function fib_m(n) { var f = arguments.callee, m = f._m || (f._m = {0:1, 1:1}); return m[n] || (m[n] = f(n-1) + f(n-2)); }
在這裏,把查找表作爲JavaScript方法對象的一個屬性。
迭代計算
更加簡單的做法是使用迭代來計算,代碼如下:
function fib_i(n) { if (n === 0 || n === 1) { return 1; } var a = 1, b = 1, c; for (var i = 2; i <= n; i++) { c = a + b; b = a; a = c; } return c; }
這裏用了3個變量,a和b分別表示f(n-1)和f(n-2),c表示f(n)。