【发布时间】:2013-08-03 04:28:05
【问题描述】:
以下问题来自codingbat:给定一个整数数组,是否可以选择其中一些整数的一组,使得该组总和为给定的目标?
本站作者提供了如下解决方案:
public boolean groupSum(int start, int[] nums, int target) {
if (start >= nums.length) return (target == 0);
if (groupSum(start + 1, nums, target - nums[start])) return true;
if (groupSum(start + 1, nums, target)) return true;
return false;
}
假设我想尝试以下情况,其中 nums=[2,4,8] 并调用 groupSum(0,nums,10)。
我看到groupSum(0,nums,10) 将调用groupSum(1,nums,10) 和groupSum(1,nums,8)。
groupSum(1,nums,10) 调用 groupSum(2, nums,10) 和 groupSum(2, nums,6)
groupSum(1,nums,8) 调用 groupSum(2,nums,8) 和 groupSum(1,nums,4)
等等……
通过代码我看到以下调用:
groupSum(3,nums,10)
groupSum(3,nums,2)
groupSum(3,nums,6)
groupSum(3,nums,-2)
groupSum(3,nums,8)
groupSum(3,nums,0)
groupSum(3,nums,4)
groupSum(3,nums,-4)
我看到 groupSum(3,nums,0) 应该返回 true,因为第一行:if (start >= nums.length) return (target == 0); 但我对像 groupSum(3,nums,-4) 这样的其他调用感到困惑。从第一行开始,由于target != 0,它应该明显导致错误。
也有人可以解释为什么在
中 return true 语句是必要的if (groupSum(start + 1, nums, target - nums[start])) return true;
我以为第一行就能判断真假。
if (groupSum(start + 1, nums, target)) return true;
【问题讨论】:
-
这是递归!你认为它有意义吗??
-
我希望 groupSum(3,nums,4) 不是由 groupSum(3,nums,0) 调用的,而是从另一个较早的调用。您可以添加第四个变量来查看被调用者 - 将 start+'_'+target 添加到每个调用中,然后将其打印出来以查看它的来源。
标签: recursion