在Java

时间:2017-02-13 05:19:15

标签: java recursion

这是一个相当快速的问题。我一直无法理解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);
        }
    }
}

3 个答案:

答案 0 :(得分:4)

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

基本逻辑是:

DoSomething(n)导致:

  • doSomething的第(n-1)
  • print n
  • doSomething的第(n-1)

因此,请关注doSomething(3)

  • doSomething的(2)
  • print 3
  • soSomething(2)

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

  • doSomething的(1)
  • print 2
  • doSomething的(1)

现在插入n = 1的值:

  • doSomething的(0)
  • print 1
  • doSomething的(0)

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

因此,n = 1的动作变为

  • print 1

因此,n = 2的动作变为

  • print 1
  • print 2
  • print 1

因此,n = 3的动作变为

  • print 1
  • print 2
  • print 1
  • print 3
  • print 1
  • print 2
  • print 1

答案 1 :(得分:3)

以下是控件如何流经此递归程序的图解表示。

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

enter image description here

答案 2 :(得分:0)

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

  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。

  4. 我希望这会有所帮助。