问题指出:
编写了一个函数
canSum(targetSum, numbers)
,它接受一个targetSum
和一个数字数组作为参数。该函数应该返回一个布尔值,指示是否可以使用数组中的数字生成targetSum
。您可以根据需要多次使用数组的元素。你可以假设所有的数字都是非负的。
在我正在观看的动态编程视频中,解决方案是:
const canSum = (targetSum, numbers) => {
if (targetSum === 0) return true;
if (targetSum < 0) return false;
for (let num of numbers) {
const remainder = targetSum - num;
if (canSum(remainder, numbers) === true) {
return true;
}
}
return false;
}
我理解这段代码是如何与canSum(7, [2, 3])
这样的许多场景一起工作的。然而,我不明白这篇文章:if (targetSum === 0) return true;
,这意味着canSum(0, [2, 3])
将导致true。根据这个问题,这段代码不应该这样工作。我在这里错过了什么?
谢谢
console.log(canSum(7, [2, 4]))
导致假的
然而,
console.log(canSum(0, [2]))
结果是真的
发布于 2022-11-01 00:54:49
当它说你可以任意多次使用任何数字时,这包括使用所有数字零次,当你这样做的时候,和是0
。使用这作为递归的基本情况简化了算法,因为您一直在减去直到到达0
为止。
另一种方法是使用numbers.includes(targetSum)
作为基本情况。它们是等价的,因为当这是真的时,for
循环的迭代之一将remainder
设置为0
,递归调用将具有targetSum === 0
。
https://stackoverflow.com/questions/74270410
复制相似问题