java递归示例中的奇怪行为

时间:2017-04-25 14:11:19

标签: java recursion

我有以下程序来使用递归来获取数组元素的总和。

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中存储了总和。

1 个答案:

答案 0 :(得分:2)

问题在于您对递归的一般方法:您正在尝试使用不可重入的方法,这始终是一种危险。

该方法不可重复,因为在sum的同一对象上sumsum1的所有调用共享字段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);
}