现给定一个函数 fn ,返回该函数的一个 记忆化 版本。 一个 记忆化 的函数是一个函数,它不会被相同的输入调用两次。而是会返回一个缓存的值。 函数 fn 可以是任何函数,对它所接受的值类型没有任何限制。如果两个输入值在 JavaScript 中使用 === 运算符比较时相等,则它们被视为相同。 示例 1: 输入: getInputs = () => [[2,2],[2,2],[1,2]] fn = function (a, b) { return a + b; } 输出:[{"val":4,"calls":1},{"val":4,"calls":1},{"val":3,"calls":2}] 解释: const inputs = getInputs(); const memoized = memoize(fn); for (const arr of inputs) { memoized(...arr); } 对于参数为 (2, 2) 的输入: 2 + 2 = 4,需要调用 fn() 。 对于参数为 (2, 2) 的输入: 2 + 2 = 4,这些输入之前已经出现过,因此不需要再次调用 fn()。 对于参数为 (1, 2) 的输入: 1 + 2 = 3,需要再次调用 fn(),总共调用了 2 次。
时间: 2024-03-10 11:46:41 浏览: 133
好的,针对你的问题,我可以给你一个 JavaScript 实现来实现函数的记忆化:
```
function memoize(fn) {
const cache = new Map(); // 存储缓存结果的 Map
return function(...args) {
const key = JSON.stringify(args); // 把参数转换成字符串作为缓存的键
if (cache.has(key)) {
cache.get(key).calls++; // 如果存在缓存,增加调用次数
return cache.get(key).val;
}
const result = fn.apply(this, args);
cache.set(key, { val: result, calls: 1 }); // 把结果存入缓存中
return result;
};
}
```
这个函数接收一个函数 `fn`,并返回一个新的函数,这个函数是函数 `fn` 的记忆化版本。它会使用一个 Map 对象来存储缓存的结果,而把函数的参数转换成字符串作为缓存的键。如果结果已经存在于缓存中,则直接返回结果,否则调用函数 `fn` 来计算结果,并把结果存入缓存中。
在你的示例中,你可以这样使用这个函数:
```
const getInputs = () => [[2,2],[2,2],[1,2]];
const fn = function(a, b) { return a + b; };
const memoizedFn = memoize(fn);
const inputs = getInputs();
const results = inputs.map(input => memoizedFn(...input));
console.log(results); // 输出 [{"val":4,"calls":1},{"val":4,"calls":1},{"val":3,"calls":2}]
```
这个代码会把参数数组 `[2, 2]` 和 `[1, 2]` 分别作为函数的输入,并把计算结果存入缓存中。第二次输入 `[2, 2]` 时,会直接从缓存中取出结果,而不是再次计算。最终,这个代码会输出一个数组,其中包含了每个输入的计算结果和调用次数。
阅读全文