以下问题来自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)
and 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)
ETC...
通过代码工作,我看到以下调用:
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)
. 从第一行开始,它应该清楚地导致 false since target != 0
。
也有人可以解释为什么 return true 声明是必要的
if (groupSum(start + 1, nums, target - nums[start])) return true;
我认为第一行将确定真假。
if (groupSum(start + 1, nums, target)) return true;