Java中的简单递归出错

时间:2015-12-02 18:09:09

标签: java recursion

我在Java中尝试了这个非常简单的递归,每次运行它时都会得到一个StackOverflow-Error。我确实有一个结束递归的条件,但它仍然无法正常工作。

public class Rec {
    public static int arraySumRecursive(int[] a) {
        return sumRec(a, a.length-1);
    }

    private static int sumRec(int[] a, int i) {
        if(i == 0) {
            return a[i];
        } else {
            return a[i] + sumRec(a, i--);
        }
    }

    public static void main(String[] args) {
        int[] test = {1, 7, 2, 5};
        System.out.println(arraySumRecursive(test));
    }
}

我只是不知道问题是什么。当我用笔和纸进行程序时,它会加起来,但它仍然不起作用。

提前致谢!

编辑:

感谢大家帮帮我。我把我变成了--i。我不知道有什么区别!

4 个答案:

答案 0 :(得分:6)

i--更改为i-1。表达式i--实际上返回i,然后在之后递减。

或者,您可以使用预递减运算符:--i。这样,它首先递减i,然后返回值。但是,你真的不需要在这里改变i,所以只使用i-1可能是最有意义的。

由于i--返回与i相同的值(然后在之后递减),这意味着您的递归调用sumRec(a, i--)等同于sumRec(a, i)。这就是为什么你得到无限递归(导致StackOverflowError)。

答案 1 :(得分:4)

此:

i--

计算i当前值,然后递减。因此,您始终将i的相同值发送到下一个递归步骤。由于i永远不会改变,因此递归是无限的。

只需发送与arraySumRecursive()的初始调用中完全相同的减去值:

return a[i] + sumRec(a, i - 1);

(你可以也像这样使用递减运算符:--i但是,由于你是,所以完全没有必要将递减的值存储在i中在同一行返回,之后再也不会使用i。您需要做的就是减去该值,您无需更新i。)

答案 2 :(得分:2)

我不确定在Java上是否相同,但在使用variable--时,它会在很多基于C的语言中发送它的值,然后在之后它将减少其值,所以你应该使用variable++或者当你到达时使用

  

return a[i] + sumRec(a, i--);

它将使用相同的i值调用sumRec,然后减少i的值,从而导致StackOverflow

您可以尝试--ii - 1

答案 3 :(得分:1)

return a[i] + sumRec(a, --i);

或     返回a [i] + sumRec(a,i-1);

将i--更改为--i,即先减少然后调用,否则我不会更新并且它总是3因此进入无限循环导致stackoverflow异常