这种递归方法如何打印3次而不是只退出?

时间:2016-12-13 23:20:18

标签: java recursion

public static void foo(int n) {

    if(n > 0) {
        if(n % 2 == 0) {
            foo(n - 3); 
        } else {
            foo(n - 1); 
        }
    }

    System.out.println(n); 
}

我不理解这里的递归方法。我看到它将如何打印-1,但我不明白它将如何打印“-1 2 3”。任何帮助将不胜感激。

该方法由foo(3)

调用

2 个答案:

答案 0 :(得分:3)

这是过程..

foo(3) --> foo(2)
//because  (3 % 2 != 0)

foo(2) --> foo(-1)
//because  (2 % 2 == 0)

foo(-1) --> print -1
//because (-1 < 0)  
//goes back & continue from last point where this method is called

print 2, then exit method
//goes back & continue from last point where this method is called

print 3, then exit method
//goes back & continue from last point where this method is called

back to main()
  

我做了,我用pythontutor.com来形象化它,但我不明白为什么它打印-1后,它会回到“n%2”行

它仍然继续打印,因为在打印-1之后,即使它退出打印-1的方法,但它返回并从foo(-1)被调用的地方继续。它从那里继续..

答案 1 :(得分:1)

递归方法通过自己请求相同的方法继续工作。 在您的代码中,当您请求foo (3);

时间1:3%2=1所以这将要求ELSE部分   然后将调用foo (3-1) = foo (2);。 时间2:2%2=0所以这将要求IF部分   然后将调用foo (2-3) = foo (-1)。 时间3:-1 > 0 = False因此将调用Print方法。

系统将打印-1。   时间3功能将结束并进入时间2功能

系统会打印2   时间2功能将结束并进入时间1功能

系统将打印3

所以输出 -1 2 3