Fibonacci(斐波納契)數列的計算

斐波納契數列的計算是一個很老的話題了,出現在各種算法書中。今天寫這篇博文的出發點是在網上看了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)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章