我正在尝试学习java oop,我发现一些问题,理解为什么在递归方法中使用后增量会导致错误?我不明白。
主要类别: 公共课主要{
public static void main(String[] args) {
A a = new A();
a.res(0);
}
}
代码工作正常:
public class A {
public void res(int a){
if (a < 5)
res(a+1);
System.out.println(a);
}
}
输出:运行:
5
4
3
2
1
0 建立成功(总时间:0秒)
但是当我使用++运算符时,我得到了StackOverflowError。
public class A {
public void res(int a){
if (a < 5)
res(a++);
System.out.println(a);
}
}
答案 0 :(得分:3)
你混淆了++和++ a。根据java文档 - “唯一的区别是前缀版本(++结果)评估为增量值,而后缀版本(结果++)评估为原始值”。
在您的情况下,始终使用参数0
调用递归方法答案 1 :(得分:1)
后增量运算符在使用后递增变量,因此它只会在返回递归函数后递增变量。
您的代码正在执行此操作:
res(a++) //a = 0
//now a = 1
递归永远不会到达下一行,因此递归函数将始终调用res(0)
答案 2 :(得分:0)
嗯......你到底想要什么?让我们稍微重新编写您的程序。您的程序(崩溃的程序)可以像这样有效地重写,实现相同的效果(即由于StackOverflowError而崩溃):
public class A {
public void res(int a){
if (a < 5) {
res(a);
++a;
}
System.out.println(a);
}
}
您的变量a
只会在对res
的递归调用完成后才会递增...这绝不会,因为您始终使用相同的值调用res
。
答案 3 :(得分:0)
这是使用a+1
解决recusrive调用的方式。
a=0, res(0)
+ 0 < 5, res(1)
++ 1 < 5, res(2)
+++ 2 < 5, res(3)
++++ 3 < 5, res(4)
+++++ 4 < 5, res(5)
++++++ 5 = 5, print 5
+++++ print 4
++++ print 3
+++ print 2
++ print 1
+ print 0
关于使用a++
的代码的问题是在执行递归调用之后执行增量。所以你基本上得到:
a=0, res(0)
+ 0 < 5, res(0)
++ 0 < 5, res(0)
+++ ...