为什么这种方法有效?

时间:2018-04-10 16:15:07

标签: recursion return-value recursive-backtracking

这是一种递归回溯方法,用于查找给定数组是否可以求和目标量。 这有效:

  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;
}

该方法如何达到最终的返回声明?

1 个答案:

答案 0 :(得分:0)

在你的程序中,你有两个if语句,它们最终都会返回。如果它们都是假的,则最后一次返回有效。因此,当你点击函数的最后一行时,你可以期望这是真的:

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);
}

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