当一些计算结果可以保留下来为以后的运算提供方便的时候, 就可以用到记忆话函数
记忆化函数将计算结果存储起来,如果之后碰到相同的参数,就直接放回已经计算过的参数
使用限制: 纯函数
算法思想:空间换时间
/**
* 记忆化函数
*/
function memorize(func) {
var cache = {};
return function() {
var key = arguments.length + Array.prototype.join.call(arguments); //让参数长度与参数拼接成字符串,例如1,2 -> 212,形成唯一的key值
if(cache[key]) {
return cache[key];
} else {
cache[key] = func.apply(this, arguments);
return cache[key];
}
}
}
/**
* 求阶乘
*/
function factorial(num){
if(num == 1 || num == 0){
return 1;
}else {
return num * factorial(--num);
}
}
var memorizeFunc = memorize(factorial);
console.time('pre')
console.log(factorial(5));
console.timeEnd('pre'); // 3.162841796875ms
console.time('mem');
console.log(memorizeFunc(5))
console.timeEnd('mem'); // 0.38720703125ms