【发布时间】: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。非常感谢您指出细微差别。