Java 编码53;对正确使用退货的方式感到困惑

Java 编码53;对正确使用退货的方式感到困惑,java,recursion,function-call,Java,Recursion,Function Call,我有点困惑,为什么我下面的解决方案没有给出正确的答案。我做了一些调查,我猜这和电话的工作方式有关?我认为这两种方法都是一样的,但事实并非如此,但我并不完全理解我的方法返回的是错误的。这是我之前做的研究: 问题: 给定一个整数数组,是否可以将整数分成两个组,以便两个组的总和相同,但有以下限制:所有5的倍数的值必须在一个组中,所有3的倍数(而不是5的倍数)的值必须在另一个组中。(不需要循环。) 例如: 拆分53([1,1])→ 真的 拆分53([1,1,1])→ 假的 拆分53([2,4,2])→

我有点困惑,为什么我下面的解决方案没有给出正确的答案。我做了一些调查,我猜这和电话的工作方式有关?我认为这两种方法都是一样的,但事实并非如此,但我并不完全理解我的方法返回的是错误的。这是我之前做的研究:

问题:

给定一个整数数组,是否可以将整数分成两个组,以便两个组的总和相同,但有以下限制:所有5的倍数的值必须在一个组中,所有3的倍数(而不是5的倍数)的值必须在另一个组中。(不需要循环。)

例如:

拆分53([1,1])→ 真的

拆分53([1,1,1])→ 假的

拆分53([2,4,2])→ 真的

我的答覆是:

public boolean split53Helper(int start, int [] nums, int group3, int group5){
  if(start >= nums.length){
    return group3 == group5;
  }

  if(nums[start] % 3 == 0 ){
    if (split53Helper(start + 1, nums, group3 + nums[start], group5)){
      return true;
    }
  }

  if(nums[start] % 5 == 0){
    if (split53Helper(start + 1, nums, group3, group5 + nums[start])){
      return true;
    }
  }

  if(split53Helper(start+1, nums, group3 + nums[start], group5))
      return true;

  if(split53Helper(start+1, nums, group3, group5 + nums[start]))
      return true;

  return false;
}
正确的解决方案:

public boolean split53(int[] nums) {
    return split53Helper(0, nums, 0, 0);
}

public boolean split53Helper(int start, int[] nums, int mult5, int mult3) {
    if(start >= nums.length)
        return mult5 == mult3;

    if(nums[start] % 5 == 0)
        return split53Helper(start+1, nums, mult5 + nums[start], mult3);

    if(nums[start] % 3 == 0)
        return split53Helper(start+1, nums, mult5, mult3 + nums[start]);

    if(split53Helper(start+1, nums, mult5 + nums[start], mult3))
        return true;

    if(split53Helper(start+1, nums, mult5, mult3 + nums[start]))
        return true;

    return false;
}
我的代码没有返回最后一个呼叫吗?
如果是这样,我什么时候会使用一种返回方法而不是另一种?如果已经有详细的解释,请告诉我。我原以为我了解堆栈和函数调用是如何工作的,但现在我担心我走错了方向

请查看以下正确解决方案的说明。
我认为,解决方案是扫描存储在NUM中的数字,并检查其是否可被3或5整除,或者不可整除

如果它可以被3整除,则将其添加到第3组,然后继续下一个数字。
如果它可以被5整除,则将其添加到第5组,并继续下一个数字。
若它不能被“无”整除,你们可以尝试将二者相加,然后继续下一个数字 扫描完所有数字后,检查group3是否等于group5

public boolean split53Helper(int start, int [] nums, int group3, int group5){
      if(start >= nums.length){
        return group3 == group5;
      }

      if(nums[start] % 3 == 0 ){
         /**
          * In this case you dont have any choice as the number is divisble by 3.
          * You should add the number to group3 and move on with next number.
          * Dont put the below statement in if condition
          */
        return split53Helper(start + 1, nums, group3 + nums[start], group5);
      }

      if(nums[start] % 5 == 0){
        /**
          * In this case you dont have any choice as the number is divisble by 5.
          * You should add the number to group5 and move on with next number.
          * Dont put the below statement in if condition
          */
        return split53Helper(start + 1, nums, group3, group5 + nums[start]);
      }

      // Here you have choice, you can either put the number in group3 or group5

      if(split53Helper(start+1, nums, group3 + nums[start], group5))
          return true;

      if(split53Helper(start+1, nums, group3, group5 + nums[start]))
          return true;

      return false;
    }

请查看以下正确解决方案的说明。
我认为,解决方案是扫描存储在NUM中的数字,并检查其是否可被3或5整除,或者不可整除

如果它可以被3整除,则将其添加到第3组,然后继续下一个数字。
如果它可以被5整除,则将其添加到第5组,并继续下一个数字。
若它不能被“无”整除,你们可以尝试将二者相加,然后继续下一个数字 扫描完所有数字后,检查group3是否等于group5

public boolean split53Helper(int start, int [] nums, int group3, int group5){
      if(start >= nums.length){
        return group3 == group5;
      }

      if(nums[start] % 3 == 0 ){
         /**
          * In this case you dont have any choice as the number is divisble by 3.
          * You should add the number to group3 and move on with next number.
          * Dont put the below statement in if condition
          */
        return split53Helper(start + 1, nums, group3 + nums[start], group5);
      }

      if(nums[start] % 5 == 0){
        /**
          * In this case you dont have any choice as the number is divisble by 5.
          * You should add the number to group5 and move on with next number.
          * Dont put the below statement in if condition
          */
        return split53Helper(start + 1, nums, group3, group5 + nums[start]);
      }

      // Here you have choice, you can either put the number in group3 or group5

      if(split53Helper(start+1, nums, group3 + nums[start], group5))
          return true;

      if(split53Helper(start+1, nums, group3, group5 + nums[start]))
          return true;

      return false;
    }

以下是正确的解决方案,重新编写,使其看起来更像您的答案:

public boolean split53Helper(int start, int [] nums, int group3, int group5){
  if(start >= nums.length){
    return group3 == group5;
  }

  if(nums[start] % 3 == 0 ){
    if (split53Helper(start + 1, nums, group3 + nums[start], group5)){
      return true;
    } else {
      return false; // <-------
    }
  }

  if(nums[start] % 5 == 0){
    if (split53Helper(start + 1, nums, group3, group5 + nums[start])){
      return true;
    } else {
      return false; // <-------
    }
  }

  if(split53Helper(start+1, nums, group3 + nums[start], group5))
      return true;

  if(split53Helper(start+1, nums, group3, group5 + nums[start]))
      return true;

  return false;
}
如果这个问题的答案是“否”,那么你不应该问“如果我把它放在5的组里会怎么样?”(我指的是你答案中的第四个递归调用)

你不能把它放在5的组中,因为已知元素可以被3整除


这就是为什么当你知道它可以被3整除时,你应该立即返回,而其余的不能被分成组。

以下是正确的解决方案,重新编写后看起来更像你的答案:

public boolean split53Helper(int start, int [] nums, int group3, int group5){
  if(start >= nums.length){
    return group3 == group5;
  }

  if(nums[start] % 3 == 0 ){
    if (split53Helper(start + 1, nums, group3 + nums[start], group5)){
      return true;
    } else {
      return false; // <-------
    }
  }

  if(nums[start] % 5 == 0){
    if (split53Helper(start + 1, nums, group3, group5 + nums[start])){
      return true;
    } else {
      return false; // <-------
    }
  }

  if(split53Helper(start+1, nums, group3 + nums[start], group5))
      return true;

  if(split53Helper(start+1, nums, group3, group5 + nums[start]))
      return true;

  return false;
}
如果这个问题的答案是“否”,那么你不应该问“如果我把它放在5的组里会怎么样?”(我指的是你答案中的第四个递归调用)

你不能把它放在5的组中,因为已知元素可以被3整除


这就是为什么当你知道它可以被3整除时,你应该立即返回,而其余的不能被分成组。

什么问题是
split53
试图解决?抱歉,我添加了问题
split53
试图解决什么问题?抱歉,我添加了问题