为什么这种方法有效?

Why does this method work?

这是一种递归回溯方法,用于确定给定数组的总和是否可以达到目标数量。 这有效:

  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 groupSum(start+1,nums,target);
  return true;
}

这不是:

  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 groupSum(start+1,nums,target);
  return false;
}

该方法如何到达最终的 return 语句?

在您的程序中,您有两个 if 语句,它们都以 returning 结束。如果两者都为假,则最后一个return生效。因此,当您点击函数的最后一行时,您可以期望这是真的:

start < nums.length && groupSum(start + 1, nums, target - nums[start])

我想也许更清晰一点的版本是这样的:

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;
  return groupSum(start + 1, nums, target);
}

这是完全相同的逻辑,只是我将最后两个调换并反转了谓词(删除了 not)。