繁体   English   中英

在Java中跟踪递归方法时遇到问题

[英]Having trouble tracing recursive method in Java

这是一个相当快速的问题。 我一直无法理解Java中递归的概念,我想知道是否有人可以帮助我。 我已经成功地跟踪了我已经完成的6个递归方法中的5个,但是这个方法让我循环了一个循环。 我期待输出只是2(我跟踪的输出),但当我把它放入我的编译器时,它出现了1213121(正确的输出)。 正如我所说,到目前为止我已经能够做到这一点,但这个让我很困惑。 这是我正在使用的:

public class Recursion
{
    public static void main(String [] args)
    {
        Recursion r = new Recursion();
        r.doSomething(3);
    }

    public void doSomething(int n)
    {
        if (n > 0)
        {
            doSomething(n-1);
            System.out.print(n);
            doSomething(n-1);
        }
    }
}

我更愿意在评论中这样做,但评论的格式化使得很难遵循。 您可以按照此递归进行操作,就好像它是一个数学方程式一样。

基本逻辑是:

DoSomething(n)导致:

  • doSomething的第(n-1)
  • 打印
  • doSomething的第(n-1)

所以,让我们按照这个做doSomething(3)

  • doSomething的(2)
  • 打印3
  • soSomething(2)

所以现在我们必须弄清楚doSomething(2)做了什么,所以只需插入n = 2的值:

  • doSomething的(1)
  • 打印2
  • doSomething的(1)

现在插入n = 1的值:

  • doSomething的(0)
  • 打印1
  • doSomething的(0)

doSomething(0)是基本情况,递归停止。 基本上doSomething(0)什么都不做。

因此,n = 1的动作变为

  • 打印1

因此,n = 2的动作变为

  • 打印1
  • 打印2
  • 打印1

因此,n = 3的动作变为

  • 打印1
  • 打印2
  • 打印1
  • 打印3
  • 打印1
  • 打印2
  • 打印1

下面是控制如何通过此递归程序的图表表示。

我认为图表应该清除你的疑虑。

在此输入图像描述

让我们给下面的代码提供行号,以便进一步解释。

  1. doSomething的第(n-1);
  2. 是System.out.print(N);
  3. doSomething的第(n-1);

    第1行重定向呼叫,直到您到达n = 1。 在结束行中将调用doSomething(0)。 因为n> 0,它将返回并将打印1.然后第3行将调用doSomething(0)并返回前一个调用者,即n = 2。 它将打印2并将调用doSomething(1)。 这将打印1(121)并将返回n = 2,line3。 从这里它将返回到前一个调用者,其中n = 3。 第2行将打印3(1213)。 然后第3行将调用doSomething(2),它将附加121作为前一次调用,最终将变为1213121。

我希望这有帮助。


暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM