Java 递归方法中的后增量?

Java 递归方法中的后增量?,java,recursion,Java,Recursion,我试图学习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)

我试图学习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);
    }
}
公共A类{
公共空间资源(INTA){
if(a<5)
res(a+1);
系统输出打印项次(a);
}
}
输出:运行:

五,

四,

三,

二,

一,

0 生成成功(总时间:0秒)

但是当我使用++操作符时,我得到了StackOverflowerError

public class A {

    public void res(int a){
        if (a < 5)
            res(a++);   
        System.out.println(a);
    }
}
公共A类{
公共空间资源(INTA){
if(a<5)
res(a++);
系统输出打印项次(a);
}
}

您混淆了a++和++a。根据java文档-“唯一的区别是前缀版本(++result)的计算结果为递增值,而后缀版本(result++)的计算结果为原始值”


在您的情况下,递归方法总是使用参数0调用,这会混淆a++和++a。根据java文档-“唯一的区别是前缀版本(++result)的计算结果为递增值,而后缀版本(result++)的计算结果为原始值”


在您的情况下,递归方法总是使用参数0调用,增量后操作符在使用变量后递增变量,因此它只在递归函数返回后递增变量

您的代码正在执行以下操作:

res(a++) //a = 0
//now a = 1
递归永远不会到达下一行,因此递归函数将始终调用
res(0)


引用:

增量后运算符在使用变量后对其进行增量,因此它仅在返回递归函数后对变量进行增量

您的代码正在执行以下操作:

res(a++) //a = 0
//now a = 1
递归永远不会到达下一行,因此递归函数将始终调用
res(0)


参考资料:

嗯……你到底期望什么?让我们稍微重新编写你的程序。你的程序(崩溃的程序)可以像这样有效地重新编写,达到同样的效果(即,由于堆栈溢出错误而崩溃):

公共A类{
公共空间资源(INTA){
if(a<5){
决议(a);
++a;
}  
系统输出打印项次(a);
}
}

变量
a
只会在对
res
的递归调用完成后递增…这是永远不会递增的,因为您总是使用相同的值调用
res

那么…您到底期望什么呢?让我们稍微重新编写您的程序。您的程序(崩溃的程序)可以像这样有效地重新编写,实现相同的效果(即,由于StackOverflower错误而崩溃):

公共A类{
公共空间资源(INTA){
if(a<5){
决议(a);
++a;
}  
系统输出打印项次(a);
}
}

变量
a
只会在对
res
的递归调用完成后递增…这永远不会,因为您总是使用相同的值调用
res

这就是使用
a+1
解决递归调用的方式

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+1
解决递归调用的方法

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

这不是重复。他在问为什么增量后会产生错误。@宪兵:是的,但这很可能是因为(IMO)对增量运算符缺乏基本了解。他显然知道这叫做“增量后”.我认为更重要的是,他没有意识到增量发生在方法返回之后,直到嵌套方法返回才发生,直到该方法的嵌套方法返回才发生(等等)-所以增量实际上从未发生过。@AlexanderPogrebnyak增量前没有问题,是吗?@AlexanderPogrebnyak+1和a++之间的区别是什么?它不是重复的。他问为什么增量后会产生错误。@宪兵是的,但这是(IMO)很可能是因为他对增量运算符缺乏基本的理解。他显然知道这叫做“后增量”.我认为更重要的是,他没有意识到增量发生在方法返回之后,直到嵌套方法返回才发生,直到该方法的嵌套方法返回才发生(等等)-所以增量实际上从未发生过。@AlexanderPogrebnyak增量前没有什么问题,是吗?@AlexanderPogrebnyak a+1和a++之间的区别是什么?
++
实际上什么时候发生的?当方法返回时(在本例中从未发生过)?@宪兵它应该是
int b=a++;res b的同义词;
@Siguza它不是同义词,因为这是一个递归函数这一事实是关键。@Gendarme Run。根据您的说法,它应该给出
0,0
,根据我的说法
0,1
@Gendarme调用方法首先计算表达式a++的值。根据语言规范,它返回增量前的值。这返回值作为参数传递给该方法。但同样的操作也会增加a的值。希望它能解释。
++
何时实际发生?当该方法返回时(在本例中从未发生)?@Gendarme它应该是
int b=a++;res(b)的同义词;
@Siguza它不是同义词,因为这是一个递归函数这一事实是关键。@Gendarme Run。根据您的说法,它应该给出
0,0
,根据我的说法
0,1
@Gendarme调用方法首先计算表达式a++的值。根据语言规范,它返回增量前的值。这返回值作为参数传递给方法。但同样的操作也会增加a的值。希望它能解释。@nasuhkkin我想我