方法一: 普通递归缓存法
function fn(n){
if(isFinite(n) && n>0 && n == Math.round(n)){
if(!(n in fn)){
if(n<=1){
return 1
}else{
return fn[n] = n * fn(n-1);
}
}else{
return fn[n];
}
}
}
方法二: 高阶函数缓存法
function memorize(f){
var cache = {};
return function(){
var key = arguments.length + Array.prototype.join.call(arguments,",");
if(key in cache){
console.log(cache)
return cache[key];
}else{
return cache[key] = f.apply(this, arguments)
};
}
}
function fn2(n){
if(n<=1){
return 1
}else{
return n*factorial(n-1);
}
}
let factorial = memorize(fn2)
factorial(5)