您的位置:首页 > 编程语言 > Java开发

javascipt 的 Fibonacci 数列优化

2016-12-04 17:30 323 查看

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
;
if (typeof result !== 'number') {
result = fib(n - 1) + fib(n - 1) +fib(n);
memo
= result;
}
return result;
};
return fib;
}();


我们调用了11次,它调用了18次取得之前的存储的结果。

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

var memoizer = function (memo, formula) {
var recur = function (n) {
var resule = memo
;
if(typeof result != 'number') {
result = formula (recur,n);
memo
= result;
}
return recur;
}
}
var fibonacci = memoizer([0,1], function (recur, n) {
return recur (n - 1 ) + recur (n - 2)
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: