基本概念
简单讲就是把函数的计算结果缓存起来。这个对于计算量大的递归调用,可以加快速度。比如阶乘,斐波那契数组数组等。
第1次计算,还是耗时的,因为没有缓存;从第2次开始,可以不经过计算,直接从缓存中拿结果,速度很快。
对于递归函数,缓存的是最终结果,而不是中间过程。比如计算10的阶乘,最终缓存的是10的阶乘的结果。中间过程1 ~ 9的阶乘结果不缓存。也就是调用10的阶乘之后再调用9的阶乘,还是算第一次计算。
实现代码
文件名:memoize.js
const memoize = function(fn) {
const cache = {};
return function() {
const key = JSON.stringify(arguments);
var value = cache[key];
if(!value) {
console.log('新值,执行中...'); // 为了了解过程加入的log,正式场合应该去掉
value = [fn.apply(this, arguments)]; // 放在一个数组中,方便应对undefined,null等异常情况
cache[key] = value;
} else {
console.log('来自缓存'); // 为了了解过程加入的log,正式场合应该去掉
}
return value[0];
}
}
module.exports = memoize;
测试代码
文件名: memoize_test.js
const memoize = require('./memoize.js');
const log = console.log;
// 斐波那契数组
const fibonacci = (n) => {
return n < 2
? n
: fibonacci(n - 1) + fibonacci(n - 2);
};
const memoizeFibonacci = memoize(fibonacci);
log(memoizeFibonacci(45)); // 新值,执行中...; 1134903170 // 等待时间比较长
log(memoizeFibonacci(45)); // 来自缓存; 1134903170
log(memoizeFibonacci(45)); // 来自缓存; 1134903170
log(memoizeFibonacci(45)); // 来自缓存; 1134903170
log(memoizeFibonacci(45)); // 来自缓存; 1134903170