Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归调用结果_Java_Recursion - Fatal编程技术网

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){

我是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){
系统输出打印(“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