CodingBat split53;对于使用正确的返回方式感到困惑

问题描述 投票:0回答:1

我对以下我的解决方案为何未给出正确答案感到困惑。我做了一些挖掘,我猜想这与呼叫的工作方式有关吗?我以为两种方式是相同的,但事实并非如此,但是我不完全了解我的错误返回的原因。这是我之前所做的研究:https://softwareengineering.stackexchange.com/questions/333247/why-does-recursion-return-the-first-call-in-the-stack-and-not-the-last

问题:

给定一个整数数组,可以将整数分为两组,以便在受到以下限制的情况下,两组的总和相同:所有5的倍数的值都必须在一个组中,并且所有3的倍数(而不是5的倍数)的所有值都必须位于另一个值中。 (无需循环。)

示例:

split53([1,1])→true

split53([1,1,1])→假

split53([2,4,2])→true

我的回答:

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

我的代码是否不返回上一个电话?如果是这样,我什么时候会使用一种返回另一种方法?如果已经有详尽的解释,请告诉我。我以为我了解堆栈和函数调用的工作原理,但是现在我担心自己朝着错误的方向前进。

java recursion function-call
1个回答
0
投票

[我认为,您的解决方案是扫描以num为单位存储的数字,并检查其是否可以被3或5整除或全都不除。

如果其被3整除,则将其添加到group3并移至下一个数字。如果它可以被5整除,则将其添加到group5并移至下一个数字。如果无法将其整除,请尝试将两者相加,然后针对每种情况检查是否使group3等于group5扫描所有数字后,请检查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.
          */
        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.
          */
        return split53Helper(start + 1, nums, group3, group5 + nums[start]);
      }

      // Here you have choice, you can either put the number in group3 or group5
      // It make sense to use if condition here rather than returning result directly
      if(split53Helper(start+1, nums, group3 + nums[start], group5))
          return true;

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

      return false;
    }
© www.soinside.com 2019 - 2024. All rights reserved.