我在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。我不知道有什么区别!
答案 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上是否相同,但在使用 它将使用相同的i值调用 您可以尝试variable--
时,它会在很多基于C的语言中发送它的值,然后在之后它将减少其值,所以你应该使用variable++
或者当你到达 p>时使用
return a[i] + sumRec(a, i--);
sumRec
,然后减少i
的值,从而导致StackOverflow --i
或i - 1
答案 3 :(得分:1)
return a[i] + sumRec(a, --i);
或 返回a [i] + sumRec(a,i-1);
将i--更改为--i,即先减少然后调用,否则我不会更新并且它总是3因此进入无限循环导致stackoverflow异常