如何调用递归方法

时间:2014-07-08 19:27:45

标签: java recursion

我是Java新手。我需要知道这个递归方法是如何工作的以及如何调用它。

为什么"我来自Y"打印2次?

来电者:z(3);

通话方式

public void z(int i){

            int y=i;
            System.out.println("I am from Z");
            if(y<5){
                z(++i);
                System.out.println("I AM FROM Y");
            }

        }

输出

    I am from Z
    I am from Z
    I am from Z
    I AM FROM Y
    I AM FROM Y

3 个答案:

答案 0 :(得分:3)

让我们跟踪递归调用。

z(3) is called.
  Prints "I am from Z"
  y is 3 and y < 5: "if" is entered.
  z(4) is called.
    Prints "I am from Z"
    y is 4 and y < 5: "if" is entered.
    z(5) is called.
      Prints "I am from Z"
      y is 5 and "if" is NOT entered.  This recursive call ends.
    Prints "I AM FROM Y".  This recursive call ends.
  Prints "I AM FROM Y".  This recursive call ends.

&#34;我来自Y&#34;打印两次,每次打印一次&#34; z(4)&#34;方法调用和&#34; z(3)&#34;方法调用,但不是由&#34; z(5)&#34;方法调用。

答案 1 :(得分:0)

    每次递归调用函数时,从代码中
  • 无条件地打印出来,因此它被打印三次,但是“我来自Y”只打印两次,因为在第三次调用时,i的值是不满足if条件:
  • 在z(i == 3)的第一次调用期间,执行将进入if条件,因为i <5(3小于5)
  • 这导致z的第二次调用,i增加到4;再次,if条件成功,因为4小于5
  • 在第三次通话中,我已经增加到5(5!&lt; 5),因此不会进入if条件。
  • 因此第三次调用返回没有打印“我来自Y”
  • 但第二次和第一次打电话后分别打印出“我来自Y”

答案 2 :(得分:0)

我会稍微简化您的方法,因为在这种情况下y可以替换为i

public static void z(int i) {
    System.out.println("I am from Z");
    if (i < 5) {
        z(++i);
        System.out.println("I AM FROM Y");
    }
}

如您所见,只有当z(++i)小于i时,此方法才会递归调用另一个5。另外I am from Z是强制性的(没有条件阻止它打印),但I AM FROM Y是可选的(它取决于i < 5的结果,就像递归调用一样)。

换句话说,最后一次递归调用(不会调用另一个z(++i),因为i 不会比5更少)也不会打印I AM FROM Y
这意味着I am from Z将始终打印的时间超过I am from Y

您可以通过这种方式将其可视化

I am from Z -------> z(3) 
 I am from Z ------> z(4) 
  I am from Z -----> z(5) here `i` is `5` so no `I AM FROM Y` will be printed 
 I AM FROM Y ------> z(4)
I AM FROM Y -------> z(3)

让您I am from Z打印三次,I AM FROM Y打印两次。