javascipt 的 Fibonacci 数列优化

javascipt 的 Fibonacci 数列优化

Fibonacci数列是递归函数的典型事例。一个Fibonacci数字是之前两个Fibonacci数字之和;最前面两个数字是0和1。
递归函数
var fibonacci = fucntion (n) {
    return n < 2 ? n : fibonacco(n - 1) + fibonacci(n - 2);
    };
for (var i = 0; i <= 10; i +=1 ) {
    document.write('//' + i + ':' + fibonacci(i) );
    }
这样的函数做了很多无谓的工作,我们调用了11次 fibonacci,而它自身调用了442次计算可能已被计算过的值,可使用Javascript的『记忆』"memoization"功能。

使用一个memo的数组保存结果,结果隐藏在闭包中。当函数被调用时,这个函数首先检查结果是否已存在,如果存在,就立即返回这个结果。
     var fibonacci = function () {
        var memo = [0,1];
        var fib  = function (n) {
            var result = memo[n];
            if (typeof result !== 'number') {
                result = fib(n - 1) + fib(n - 1) +fib(n);
                memo[n] = result;
            }
            return result;
    };
    return fib;
}();

我们调用了11次,它调用了18次取得之前的存储的结果。
可以把这种技术推而广之,编写一个函数来帮助我们构造带记忆功能的函数。memoizer函数取得一个初始的memo数组和formula函数。它返回一个管理memo存储和在需要时调用的formula函数。

    var memoizer = function (memo, formula) {
        var recur = function (n) {
            var resule = memo[n];
            if(typeof result != 'number') {
                result = formula (recur,n);
                memo[n] = result;
            }
            return recur;
        }
    }
    var fibonacci = memoizer([0,1], function (recur, n) {
        return recur (n - 1 ) + recur (n - 2)
    };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值