算法问题陈述:找到加起来等于目标总和的最小数组。
代码问题:我不理解以下两种方法在结果上的差异:
- 使用arr.push()方法
vs.
- 使用Spread语法
请参考下面的注释行。
Spread语法返回正确的解决方案,而.push()方法会一直推送到同一个数组。我不明白为什么它会在内存中引用同一个数组。
非常感谢!
let howSum = (target, arr, memo = {}) => {
if (target in memo) return memo[target];
if (target === 0) return [];
if (target < 0) return null;
let smallest = null;
for (let e of arr) {
if (howSum(target - e, arr, memo) !== null) {
let result = howSum(target - e, arr, memo);
// result.push(e);
result = [...result, e];
if (smallest === null || result.length < smallest.length) {
smallest = result;
}
}
}
memo[target] = smallest;
return smallest;
};
console.log(howSum(10, [1, 2, 5])); // [5, 5]
result = [...result, e];
创建了一个新的数组。这并不是因为特别使用了扩展运算符,而只是因为result = [ ]
把一个新的数组分配给了result
。 - Felix Klingmemo[target]
条目都指向同一个数组,这意味着每个target
的记忆化解决方案完全相同,这显然在概念上是错误的。 - Felix Kling