现给定一个函数 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-23 13:37:51 浏览: 56
这道题需要实现一个记忆化函数,思路如下:
1. 定义一个空对象作为缓存对象,用于存储已经计算过的结果。
2. 返回一个新函数,这个新函数接受任意个参数。
3. 在新函数内部,将所有参数序列化为一个字符串,作为缓存对象的键。
4. 判断缓存对象中是否已经存在该键,如果存在则直接返回对应的值。
5. 如果不存在,则调用原始函数 fn,并将计算结果存入缓存对象中,并返回计算结果。
具体实现代码如下:
```javascript
function memoize(fn) {
const cache = {};
return function(...args) {
const key = JSON.stringify(args);
if (cache[key]) {
return cache[key];
}
const result = fn.apply(this, args);
cache[key] = {val: result, calls: 1};
return cache[key];
}
}
```
在这个函数中,我们使用了 apply 方法来动态传递参数,以便支持任意个参数。同时,我们将函数的调用次数也保存在缓存对象中,以便统计。
接下来,我们可以使用这个记忆化函数来计算示例中的输入:
```javascript
const getInputs = () => [[2,2],[2,2],[1,2]];
const fn = function (a, b) { return a + b; }
const memoized = memoize(fn);
const inputs = getInputs();
const result = inputs.map(arr => memoized(...arr));
console.log(result); // [{"val":4,"calls":1},{"val":4,"calls":1},{"val":3,"calls":1}]
```
这里我们使用 map 方法来对每个输入进行计算,并将计算结果存入一个数组中。最终输出的结果中,val 表示计算结果,calls 表示调用次数。
阅读全文