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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值