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)
};