面试题答案
一键面试实现带有记忆化的递归 reduce
类似功能
// 记忆化缓存
const memoize = (fn) => {
const cache = new Map();
return (arg) => {
const key = arg.toString();
if (cache.has(key)) {
return cache.get(key);
}
const result = fn(arg);
cache.set(key, result);
return result;
};
};
// 递归处理嵌套数组并累加
const nestedReduce = (arr, initial = 0) => {
let sum = initial;
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
sum += nestedReduce(arr[i]);
} else {
sum += arr[i];
}
}
return sum;
};
// 记忆化版本
const memoizedNestedReduce = memoize(nestedReduce);
记忆化提升性能的原理
记忆化通过缓存函数的计算结果,避免了重复计算。当相同的输入再次出现时,直接从缓存中获取结果,而不需要重新执行函数体。在递归计算嵌套数组累加的场景中,如果存在重复的子数组,记忆化可以显著减少递归调用次数,从而提升性能。
记忆化在这种场景下的适用范围
- 输入重复性高:如果嵌套数组中存在大量重复的子数组结构,记忆化能极大提升性能。例如,数组中多次出现相同的子数组片段。
- 计算代价大:递归计算嵌套数组累加本身可能会因为多次重复遍历子数组而消耗较多资源,记忆化对于这种计算代价较大的操作优化效果明显。
- 数据结构相对稳定:如果数组结构不会频繁变化,缓存的结果可以被多次复用,记忆化就很适用。但如果数组频繁变动,缓存的有效性会降低。