以下问题来自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;