【问题标题】:Divide And Conquer Sum Of Array Of Integers整数数组的除法和求和
【发布时间】:2020-06-28 18:06:39
【问题描述】:

我编写了下面的程序来使用 Java 中的分治递归算法找到所有整数的总和:

但不知何故,总和不正确。

public class DivideAndConquerSum {
 public static void main(String[] args) {
    int[] arr = new int[]{2, 3, 4, 5};
    System.out.println(calculateRecursiveSum(arr, 0, arr.length));
  }
  static long sum = 0;
  static long calculateRecursiveSum(int[] arr, int low, int high) {
    if (high == low) {
      return arr[0];
    } else {
      int mid = (high + low) / 2;
      sum = calculateRecursiveSum(arr, low, mid) +
            calculateRecursiveSum(arr, mid + 1, high);
    }
    return sum;
  }
}

谁能告诉我代码中有什么问题来解决它?在这种情况下只假设正整数。

【问题讨论】:

  • 我知道出了什么问题,如果您在调试器中逐步执行此操作,您也会看到
  • 二进制chop类型构造的问题在于high参数是要包含在总和中的最后一个项目的索引,还是最后一个+1。在这种情况下,以high = arr.length 开头表示它是最后一个+1,但这与sum = .... 递归不一致,后者错过了arr[mid]。如果 high 是最后一项包含在总和中,return arr[0] 需要是 return arr[low],但其他所有内容都照常工作——当然,除了你从 arr.length - 1 开始,你需要注意出去arr.length == 0。这是旧的“1 倍出局”问题。
  • 注意到@ChrisHall。非常感谢您指出细微差别。

标签: java arrays algorithm


【解决方案1】:

您的方法基本上会重新计算 mid,因此您需要在该点返回值。它更适合二分查找。但是进行以下更改,它将起作用。

       static long calculateRecursiveSum(int[] arr, int low, int high) {
          if (high == low) {
                return 0;
            }
            int mid = (high + low) / 2;
            return arr[mid] + calculateRecursiveSum(arr, low, mid) + 
                      calculateRecursiveSum(arr, mid+1, high);
       }

【讨论】:

  • 这对我来说是一个可怕的错过。非常感谢。只是想知道有没有其他方法可以实现同样的效果,而不是“二进制搜索”?
  • 并非如此。除了线性总结它们的简单递归例程。问题是您需要同时满足偶数和奇数的值。而你的方法做到了。
  • 当然。非常感谢。
【解决方案2】:

您的方法几乎没问题,在这里我纠正了一些问题以保持您的想法有效。

public class DivideAndConquerSum
{
   public static void main(String[] args)
   {
      int[] arr = new int[] { 2, 3, 4, 5 };
      System.out.println(calculateRecursiveSum(arr, 0, arr.length - 1));
   }

   // static long sum = 0;
   static long calculateRecursiveSum(int[] arr, int low, int high)
   {
      // long sum=0;
      if (high == low)
      {
         return arr[low];
      }
      else
      {
         int mid = (high + low) / 2;
         return (calculateRecursiveSum(arr, low, mid) + calculateRecursiveSum(arr, mid + 1, high));
      }
      // return sum;
   }
}

您不需要额外的静态变量来存储结果。直接返回递归调用将为您完成。

【讨论】:

  • 是的。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
相关资源
最近更新 更多