我有以下程序来使用递归来获取数组元素的总和。
public class ArraySum {
int sum = 0;
private int sum(int[] array, int index) {
if (index + 1 == array.length) {
return array[index];
}
sum += (array[index] + sum(array, index + 1));
return 0;
}
public static void main(String[] args) {
int[] array = {1, 2, 3, 4, 5};
ArraySum arraySum = new ArraySum();
arraySum.sum(array, 0);
System.out.println(arraySum.sum);
}
}
我在上面的代码中得到了错误的输出。
输出:1 (这是数组的第一个元素)
现在当我将加法运算分成两个不同的语句时,我得到了正确的输出,
sum += (array[index] + sum(array, index + 1));
已更改
int currentSum = (array[index] + sum(array, index + 1));
sum += currentSum;
新输出为:15 (这是正确的)。
有人可以解释这背后的原因吗?
请注意,我从函数返回零,但我在类成员sum
中存储了总和。
答案 0 :(得分:2)
问题在于您对递归的一般方法:您正在尝试使用不可重入的方法,这始终是一种危险。
该方法不可重复,因为在sum
的同一对象上sum
和sum1
的所有调用共享字段Test
,并且永远不会重置为零(这是导致您正在观察的错误行为的原因)。
解决此问题的正确方法是删除sum
字段,而不是从sum
返回sum1
,而不是零:
private int sum1(int[] array, int index) {
if (index == array.length) {
return 0;
}
return array[index] + sum1(array, index + 1);
}
public int sum(int[] array) {
return sum1(array, 0);
}