【问题标题】:How does this recursive function get to this output?这个递归函数如何得到这个输出?
【发布时间】:2016-04-16 00:26:41
【问题描述】:

当我为 n=5 运行这段代码时,我得到的输出是“5 3 1 1 3 5” 我得到了 5 3 1 部分,但在那之后 n=-1 但是当我使用调试器运行代码时,当 n=-1 时,它会转到 numbers(n-2);ie System.out.prt(n+ ""); 之后的行,即使该语句包含在如果阻塞。

为什么会这样?

public void numbers(int n)
{
    if(n>0)
    {
        System.out.print(n+" ");
        numbers(n-2);
        System.out.print(n+" ");
    }
}

TLDR : 当 n=-1 System.out.prt(n+ "");即使它在 if 块内,只在 n>0 时运行。

任何帮助将不胜感激。提前致谢!

【问题讨论】:

    标签: java function if-statement recursion


    【解决方案1】:

    去掉最后的 System.out.print(n+" "); 在递归数字调用后,它会返回 n 的原始值并再次打印。

    它从最深的层次开始冒泡,从最深处打印 1 两次,直到调用编号为 3 的呼叫,然后再次打印,然后再次打印 5。

    如果您希望它在第一次打印后更新值,则必须通过执行 n-=2 而不是 n-2 来更新变量 n

    【讨论】:

      【解决方案2】:

      下面是幕后发生的事情,n == 5

      numbers(5);
          if(5 > 0)--> true : 
              System.out.print(5 + " "); // (1)
              numbers(3);
              |   if(3 > 0)--> true : 
              |       System.out.print(3 + " "); // (2)
              |       numbers(1);
              |       |   if(1 > 0)--> true : 
              |       |       System.out.print(1 + " "); // (3)
              |       |       numbers(-1);
              |       |       System.out.print(1 + " "); // (4)
              |       System.out.print(3 + " "); // (5)
              System.out.print(5 + " "); // (6)
      

      注意每个数字应该如何打印两次:

      System.out.print(n + " "); // print once
      numbers(n-2);
      System.out.print(n + " "); // print twice
      

      【讨论】:

      • 能否请您详细说明为什么在第二次打印 1 后又打印 3 和 5 后?
      【解决方案3】:
          5 first system.out then number(5-2)
          |
          ----> 3  first system.out then number(5-2)
                |
                 ----->1 first system.out then number(5-2)
                       (smaller than 0) , returning
                       |
                       1 second system.out
                       |
                 3<----  second system.out
                 |
      5<---------  second system.out
      

      【讨论】:

        【解决方案4】:

        n=-1 后,递归调用将结束并返回调用者方法继续。它找到的第一个命令是 print。

        如果你尝试用调试器进行调试,你会发现它是多么的合理。

        【讨论】:

        • 啊,好吧!但是为什么每次打印都加2呢?!
        • 因为它会以相反的顺序进行,旧命令以队列顺序保存,后进先出。所以它不加2,它只是打印n的值,即每次减去2之前的值。
        • 顺便说一句,当你到达 n=-1 时,你还没有退出 if 语句,你只是处于更深层次的递归。
        【解决方案5】:

        Java 将方法调用维护到堆栈中,并打印第一个 5,3,1,然后打印剩余调用的方法调用并从堆栈中打印 1,3,5(堆栈中的最后一个调用首先被拾取)。

        【讨论】:

          【解决方案6】:

          遵循递归堆栈。

          堆栈表示和输出流:

                       ------------------------->
                       5           3            1
          num(5)-->  num(3) --> num(1) --> num(-1) --> void
                       5           3            1
                       <-------------------------
          

          现在由于 numbers(-1) 不满足 if 条件,程序控制从 if 块中出来,并返回 void。 现在开始弹出堆栈(递归): 5 3 1 1 3 5. 这就是你得到的输出,也是预期的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-12-13
            • 1970-01-01
            • 1970-01-01
            • 2021-02-04
            • 2015-08-21
            • 2011-03-29
            • 2017-02-20
            • 1970-01-01
            相关资源
            最近更新 更多