这个递归函数如何获得此输出?

时间:2016-01-11 15:59:47

标签: java function if-statement recursion

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

为什么会这样?

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+ "");时,即使它位于仅在n> 0时运行的if块内。

非常感谢任何帮助。提前致谢!

6 个答案:

答案 0 :(得分:1)

删除最终的System.out.print(n +“”); 在递归数字调用之后,它返回n的原始值并再次打印。

它从最深的水平回弹,它打印1次,直到数字3的呼叫,再次打印,再次打印5次。

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

答案 1 :(得分:1)

以下是幕后发生的事件,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

答案 2 :(得分:0)

    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

答案 3 :(得分:0)

在n = -1之后

,递归调用将结束并返回调用方法继续。它发现的第一个命令是打印。

如果您尝试使用调试器进行调试,您将看到它是多么合理。

答案 4 :(得分:0)

Java维护方法调用进入堆栈并且首先打印5,3,1,然后执行剩余调用的方法调用resume执行并从堆栈打印1,3,5(堆栈中的最后一次调用首先获取)。

答案 5 :(得分:0)

跟随递归堆栈。

使用和输出流的堆栈表示:

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

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