当前位置:  开发笔记 > 编程语言 > 正文

递归调用结果

如何解决《递归调用结果》经验,为你挑选了2个好方法。

我是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?我没有得到那一部分.



1> G_H..:

GeraldMücke提供的答案是最好的方法:推出代码并查看实际调用方法的顺序.重要的是要知道递归print(i-1)调用是阻塞的.它将一直等到它的调用返回后才继续进入下一个语句,即for循环.这意味着当你进入i参数为1 的调用时,你有4个深度调用:print(4) - > print(3) - > print(2) - > print(1).这就是为什么人们会说"调用堆栈"以及为什么在输出异常时获得堆栈跟踪的原因.哦,为什么你得到stackoverflow错误,如果你的调用堆栈如此深入(例如,没有结束条件的递归)它超过某个值,则调用此站点.

当杰拉尔德输入他的答案时,我正在制作一个可以帮助你更好地表现的视觉表现.彩色块是方法调用,嵌套显示它们如何在调用堆栈中彼此叠加,以及程序语句流的箭头. 递归程序流和调用堆栈



2> Gerald Mücke..:

让我们推出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的一部分


`i-1`不会改变`i`的值,而是创建一个新值,传递给下一个调用.但是一旦该方法返回,原始`i`的值再次有效,
推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有