乐趣区

关于javascript:JS写斐波那契数列的几种方法

斐波那契数,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波那契数列以如下被以递归的办法定义:F0=0,F1=1,Fn=Fn-1+Fn-2(n>=2,n∈N*),用文字来说,就是斐波那契数列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。

罕用的计算斐波那契数列的办法分为两大类:递归和循环。

递归
办法一:一般递归
代码柔美逻辑清晰。然而有反复计算的问题,如:当 n 为 5 的时候要计算 fibonacci(4) + fibonacci(3),当 n 为 4 的要计算 fibonacci(3) + fibonacci(2),这时 fibonacci(3) 就是反复计算了。运行 fibonacci(50) 会呈现浏览器假死景象,毕竟递归须要堆栈,数字过大内存不够。

复制代码

function fibonacci(n) {if (n == 1 || n == 2) {return 1};
    return fibonacci(n - 2) + fibonacci(n - 1);
}
fibonacci(30)

复制代码
办法二:改良递归 - 把前两位数字做成参数防止反复计算
复制代码

function fibonacci(n) {function fib(n, v1, v2) {if (n == 1)
            return v1;
        if (n == 2)
            return v2;
        else
            return fib(n - 1, v2, v1 + v2)
    }
    return fib(n, 1, 1)
}
fibonacci(30)

复制代码

办法三:改良递归 - 利用闭包个性把运算后果存储在数组里,防止反复计算
复制代码

var fibonacci = function () {let memo = [0, 1];
    let fib = function (n) {if (memo[n] == undefined) {memo[n] = fib(n - 2) + fib(n - 1)
        }
        return memo[n]
    }
    return fib;
}()
fibonacci(30)

复制代码
办法三 1:改良递归 - 摘出存储计算结果的性能函数
复制代码

var memoizer = function (func) {let memo = [];
    return function (n) {if (memo[n] == undefined) {memo[n] = func(n)
        }
        return memo[n]
    }
};
var fibonacci=memoizer(function(n){if (n == 1 || n == 2) {return 1};
    return fibonacci(n - 2) + fibonacci(n - 1);
})
fibonacci(30)

复制代码
循环
办法一:一般 for 循环
复制代码

function fibonacci(n) {
    var n1 = 1, n2 = 1, sum;
    for (let i = 2; i < n; i++) {
        sum = n1 + n2
        n1 = n2
        n2 = sum
    }
    return sum
}
fibonacci(30)

复制代码
办法二:for 循环 + 解构赋值
复制代码

var fibonacci = function (n) {
    let n1 = 1; n2 = 1;
    for (let i = 2; i < n; i++) {[n1, n2] = [n2, n1 + n2]
    }
    return n2
}
fibonacci(30)
退出移动版