递归函数输出不清楚

时间:2017-01-22 15:45:12

标签: java recursion

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

我有上面的代码段。 当我拨打电话时(5) 它给了我一个输出:531135

我理解到531.但是在此之后,当n <0时,如何能够达到第二个印刷语句。为什么这样135?

我真的对此没有任何线索,请帮我详细解释和干运行。

如果我问傻事请原谅我。

谢谢

2 个答案:

答案 0 :(得分:0)

我要尝试追踪该计划正在做什么:

numbers(5)
  5>0
    print(5)
    numbers(3)
      3>0
        print(3)
        numbers(1)
          1>0
            print(1)
            numbers(-1)
              -1>0
            print(1)
        print(3)
    print(5)

如您所见,每个函数调用的第二个print - 语句不依赖于任何if(递归调用的if并不重要调用方法)。因此,每个数字总是打印两次(或从不)。

我希望这一点有点明白。

答案 1 :(得分:0)

您可以使用调试器来完成该程序。下面我修改了 你的程序并添加了一些显示各种状态的println() 该计划。我还添加了r来显示递归级别和__ 帮助缩进输出。看看这现在是否有助于您理解 更好。

public class NumberRecursion {

    public static void main(String[] args) {
        numbers(5);

    }

    private static int r = 0;           // recursion level
    private static String __ = "";      // indent prefix
    public static void numbers(int n)
     {
        r++;                            // recursion level
        __ += "    ";                   // indent by another four spaces 

        System.out.println(__+ "[" + r + "] numbers(" + n + ") entered");
         if(n>0)                    // L3
         {
             System.out.println(__+ "["  + r + "] L3 tested true (and n=" + n + ")");
             System.out.println(n); // P1
             System.out.println(__+ "["  + r + "] about to invoke numbers(" + (n-2) + ")");
             numbers(n-2);          // N
             System.out.println(__+ "["  + r + "] numbers(" + (n-2) + ") just finished");
             System.out.println(n); // P2
         } else {
            System.out.println(__+ "[" + r + "] L3 tested false (and n=" + n + ")");
         }
        System.out.println(__+ "["  + r + "] numbers(" + n + ") about to return");
        __ = __.substring(0, __.length()-4);
                                        // indent now has four less spaces
        r--;                            // recursion level
     }


}

这个程序的输出就是这个。在此输出中,数字以平方为单位 括号(例如[1])是递归的级别。

    [1] numbers(5) entered
    [1] L3 tested true (and n=5)
5
    [1] about to invoke numbers(3)
        [2] numbers(3) entered
        [2] L3 tested true (and n=3)
3
        [2] about to invoke numbers(1)
            [3] numbers(1) entered
            [3] L3 tested true (and n=1)
1
            [3] about to invoke numbers(-1)
                [4] numbers(-1) entered
                [4] L3 tested false (and n=-1)
                [4] numbers(-1) about to return
            [3] numbers(-1) just finished
1
            [3] numbers(1) about to return
        [2] numbers(1) just finished
3
        [2] numbers(3) about to return
    [1] numbers(3) just finished
5
    [1] numbers(5) about to return
相关问题