我是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 }
当我做print(4)
的结果是,YYY1223334444
但为什么不呢YYY1
?我没有得到那一部分.
GeraldMücke提供的答案是最好的方法:推出代码并查看实际调用方法的顺序.重要的是要知道递归print(i-1)
调用是阻塞的.它将一直等到它的调用返回后才继续进入下一个语句,即for循环.这意味着当你进入i
参数为1 的调用时,你有4个深度调用:print(4) - > print(3) - > print(2) - > print(1).这就是为什么人们会说"调用堆栈"以及为什么在输出异常时获得堆栈跟踪的原因.哦,为什么你得到stackoverflow错误,如果你的调用堆栈如此深入(例如,没有结束条件的递归)它超过某个值,则调用此站点.
当杰拉尔德输入他的答案时,我正在制作一个可以帮助你更好地表现的视觉表现.彩色块是方法调用,嵌套显示它们如何在调用堆栈中彼此叠加,以及程序语句流的箭头.
让我们推出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 }
在if之后代码deos不返回但是执行for循环.
如果您是Java新手,请熟悉一个调试器,它允许逐步执行和值内省,并且是每个Java IDE的一部分