在浏览器中,一个算法的执行时间往往会成为瓶颈,我们可以将上一次计算的结果缓存起来。在函数式编程当中,这种缓存技巧叫做记忆(memorize):
function memorize( fn ) {
var cache = {};//保存缓存的对象
return function(){
var key = arguments.length + Array.prototype.join.call( arguments, ","); //产生一个缓存的键: 参数长苏+参数
if(key in cache) {
return cache[key];
}else {
return cache[key] = f.apply( this, arguments );
}
}
}
下面是一个计算两个书最大公约数的例子:
//计算函数
function gcd(a,b) {
var t;
if(a<b) {
t=b; b=a; a=t;
}
while(b != 0) {
t=b;b=a%b;a=t;
}
return a;
}
var gcdmemo = memorize(gcd);
gcdmemo(85,187);
一个阶乘的求解例子:
var fact = memorize(function(n) {
return (n<=1) ? 1 : n*fact(n-1);
});
fact(5);