Java 递归方法中的后增量?
我试图学习java oop,我发现理解递归方法中使用后增量导致错误的原因有一些问题?我不明白 主要类别: 公共班机{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)
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我想我