我遇到了提高我的编码技能的递归练习,并发现了以下问题。
给定一个整数数组,是否可以选择一组整数,使得该组总和为给定目标?我们的惯例不是查看整个数组,而是考虑从索引开始到数组末尾的数组部分。调用者可以简单地通过将 start 传递为 0 来指定整个数组。不需要循环——递归调用沿着数组向下进行。
groupSum(0, [2, 4, 8], 10) → true
groupSum(0, [2, 4, 8], 14) → true
groupSum(0, [2, 4, 8], 9) → false
经过2天的工作和学习,我什么都没有。我检查了给定的解决方案,但在逐步调试后我仍然无法理解解决方案。
public boolean groupSum(int start, int[] nums, int target) {
// Base case: if there are no numbers left, then there is a
// solution only if target is 0.
if (start >= nums.length) return (target == 0);
// Key idea: nums[start] is chosen or it is not.
// Deal with nums[start], letting recursion
// deal with all the rest of the array.
// Recursive call trying the case that nums[start] is chosen --
// subtract it from target in the call.
if (groupSum(start + 1, nums, target - nums[start])) return true;
// Recursive call trying the case that nums[start] is not chosen.
if (groupSum(start + 1, nums, target)) return true;
// If neither of the above worked, it's not possible.
return false;
}
解决方案很短,其逻辑是基于组合的。你怎么看待这件事?它背后的算法解释是什么?
问候