memoized函数
memoized函数实现原理:使用一组参数初次调用函数时,缓存参数和计算结果,当再次使用相同的参数调用该函数时,直接返回相应的缓存结果。
memoized函数:
点击查看代码
function memoize(func, hasher) {
if (typeof func !== 'function') {
throw new TypeError('Expected a function');
}
const memoized = function(...args) {
// 使用剩余参数(...args)来获取所有参数
const address = hasher ? hasher.apply(this, args) : args[0]; // 假设hasher接收所有参数,或者只使用第一个参数作为key
const cache = memoized.cache;
if (cache.has(address)) {
console.log('直接读缓存')
return cache.get(address);
}
console.log('没有缓存')
const result = func.apply(this, args);
// 缓存结果,注意这里不需要重新赋值memoized.cache,因为它已经是一个Map的引用
cache.set(address, result);
return result;
};
// 初始化缓存
memoized.cache = new Map();
return memoized;
}
示例:
不带有hasher函数的示例
点击查看代码
// 使用示例
function factorial(n) {
return n <= 1 ? 1 : n * factorial(n - 1);
}
const memoizedFactorial = memoize(factorial);
console.log(memoizedFactorial(5)); // 第一次调用,计算阶乘并缓存结果
console.log(memoizedFactorial(5)); // 第二次调用,直接从缓存中获取结果
带有hasher函数的示例
点击查看代码
// 带有hasher函数的示例
function customHasher(a, b) {
return a + b; // 假设我们基于两个参数的和来缓存结果
}
function sum(a, b) {
return a + b;
}
const memoizedSum = memoize(sum, customHasher);
console.log(memoizedSum(1, 2)); // 第一次调用,计算并缓存结果
console.log(memoizedSum(2, 1)); // 由于hasher函数返回相同的key,所以直接从缓存中获取结果
本文来自博客园,🐱🚀作者:FAIGEL,打字创作不易,如转载请注明原文链接:https://www.cnblogs.com/FAIGEL/articles/18218604。谢谢✨

浙公网安备 33010602011771号