斐波那契數列的計算 [JavaScript]

斐波那契數列指的是這樣一個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,...    這個數列從第3項開始,每一項都等於前兩項之和。由數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖爲例子而引入,故又稱爲“兔子數列”。典型的面試問題。

解法一: 遞歸解法

let fibnacci = n  => n <= 0 ? 0 : n == 1 ? 1 : fibnacci( n - 2 ) + fibnacci( n - 1 );

     但上述函數的複雜度是指數級的(o^n)

解法二: 迭代法(動態規劃的思想)

let fibnacci = n => {
    if( n == 0 ){
        return 0;
    }
    let a1 = 0, a2 = 1;
    for( let i = 1; i < n; i ++ ) {
        [a1, a2] = [a2, a1 + a2];
    }
    return a2;
}

上述解法的時間複雜度是O(n)

解法三: 用數學方法解答(通項公式)(存在浮點數,得使用Math.round實現整數轉換)

let fibnacci = n => (Math.pow((1 + Math.sqrt(5))/2, n) - Math.pow((1 - Math.sqrt(5))/2, n)) / Math.sqrt(5);

上述解法中因用了Math.pow(),冪次函數,所以時間複雜度是O(log(n))

解法四: 使用矩陣乘法來實現(暫未實現正確運行,後面再來看看原因,希望懂得大佬也給指點下)

let  matrix22_mul = (x, y) => [
    [x[0][0] * y[0][0] + x[0][1] * y[1][0], x[0][0] * y[0][1] + x[0][1] * y[1][1]],
    [x[1][0] * y[0][0] + x[1][1] * y[1][0], x[1][0] * y[0][1] + x[1][1] * y[1][1]]
];

let matrix22_pow = (x, n) => {
    let r = [[1, 0], [0, 1]];
    let v = x;
    while(n) {
        if(n % 2 == 1) {
            r = matrix22_mul(r, v);
            n -= 1;
        }
        v = matrix22_mul(v, v);
        n = n / 2;
    }
    return r;
}

 

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