Java 递归调用结果
我是java新手,在学习一些关于递归的文章时,偶然发现了这个我不懂的小程序Java 递归调用结果,java,recursion,Java,Recursion,我是java新手,在学习一些关于递归的文章时,偶然发现了这个我不懂的小程序 static void print(int i) { if ( i > 1) { System.out.print("Y"); print(i-1); } for (int t = 0; t < i ; t++) System.out.print(i); // i not t } 静态无效打印(int i){ 如果(i>1){
static void print(int i) {
if ( i > 1) {
System.out.print("Y");
print(i-1);
}
for (int t = 0; t < i ; t++)
System.out.print(i); // i not t
}
静态无效打印(int i){
如果(i>1){
系统输出打印(“Y”);
印刷品(i-1);
}
for(int t=0;t
当我打印(4)时,结果是
YYY1223334444
,但为什么不是yyyy1
?我不明白这一点。让我们来介绍ifs、递归和循环。系统的功能:
print(i=4) {
System.out.print("Y") -> Y
print(i=3) {
System.out.print("Y") -> YY
print(i=2){
System.out.print("Y") -> YYY
print(i=1){
//skip if and print 1x i=1
System.out.print(1) -> YYY1
}
//print 2x i=2
System.out.print(2) -> YYY12
System.out.print(2) -> YYY122
}
//print 3x i=3
System.out.print(3) -> YYY1223
System.out.print(3) -> YYY12233
System.out.print(3) -> YYY122333
}
//print 4x i=4
System.out.print(4) -> YYY1223334
System.out.print(4) -> YYY12233344
System.out.print(4) -> YYY122333444
System.out.print(4) -> YYY1223334444
}
代码deo不会在if之后返回,而是执行for循环
如果您是Java新手,请熟悉调试器,它允许一步一步执行和值内省,并且是每个Java IDE的一部分。Gerald Mücke提供的答案是最好的方法:展开代码并查看方法的实际调用顺序。重要的是要知道递归的
print(i-1)
调用是阻塞的。它将等待调用返回,然后继续执行下一条语句,即for循环。这意味着当您到达i
参数为1的调用时,您有4个调用:print(4)->print(3)->print(2)->print(1)。这就是为什么人们谈论“调用堆栈”,以及为什么如果输出异常,就会得到堆栈跟踪。哦,如果调用堆栈太深(例如,没有结束条件的递归)以至于超过某个值,那么为什么会出现调用此站点的stackoverflow错误呢
当杰拉尔德键入他的答案时,我正在做一个视觉表现,可能会帮助你更好地理解。彩色块是方法调用,嵌套显示了它们如何在调用堆栈中彼此重叠,箭头表示程序的语句流。
您是否尝试过在调试器中单步执行它?(提示:如果
块完成后,您认为会发生什么情况?)Oeh这是一个很好的方法,我会立即尝试,谢谢谢谢,但有一个小问题。在if
之后,代码执行for
循环,但此时不是i
,它如何变成2?@YoussefSakuragi返回调用它的方法,其中i
是2。递归中的一个基本概念是,多个调用被堆叠起来,直到您返回到它们。i-1
不会更改i
的值,而是创建一个新值,并将其传递给下一个调用。但是一旦该方法返回,原始i
的值就再次有效,@YoussefSakuragi查找“按值调用”和“按引用调用”,然后了解Java是如何工作的。将计算i-1
,并将该值作为参数传递给方法调用。无法要求比此更正确的答案!谢谢。你用什么来创建这个奇特的图表?@Gala我用了draw.io,你可以在浏览器中使用它,而且是免费的。这是jGraph的。就绘图软件而言,这一个似乎对我的努力阻力最小:DA+用于绘图@G_H