js闭包记忆化编程学习
利用记忆化使递归次数大大减少。
以Fibonacci数列为例:
var fibonacci = function(){
var memo = [0, 1];
var fib = function(i){
var result = memo[i];
if(typeof result !== 'number'){
result = fib[i-1]+fib[i-2];
memo[i] = result;
}
return result;
}
return fib;
}();
for(var i = 0; i < 10; ++i){
console.log(fibonacci(i));
}
进一步封装:
var memoizer = function(memo, fundamental){
var shell = funciton(n){
var result = memo[n];
if(typeof result !== 'number'){
result = fundamental(shell, n);
memo[n] = result;
}
return result;
};
return shell;
}
//斐波那契数列
var fibonacci = memoizer([0,1], function(shell, n){
return shell(n - 1)+shell(n - 2);
})
//阶乘
var factorial = memoizer([1,1], function(shell, n){
return shell(n-1)*n;
})