为什么我得到这个输出?

时间:2011-10-10 10:13:36

标签: java recursion

为什么我得到这个输出?我希望输出为10,9,8 ......

但它是11,12,13 ......

class tester {

    static int i = 0;

    public static void main(String args[]) {
        recursive();
        System.out.println("after recursive");
    }

    public static void recursive() {
        while(i++<10) {
            recursive();
            System.out.println(i);
        }
    }

}

5 个答案:

答案 0 :(得分:2)

简单的逻辑如下:

由于您的增量是posfix increment,因此在增量之前首先评估原始值。

逻辑:

while (i++ < 10) { recursive();}
  1. i最初为0,因此,0 < 10(真),增加1.现在,请致电recursive()
  2. 这循环(1)直到i = 10。在评估i = 10时,while表达式为false,因此它将离开循环。

    请记住,我们已经调用了recursive() 10次,所以它现在需要打印i 10次,(因为JVM在堆栈中推送recursive()函数10次) 。每次弹出该函数时,它都会返回System.out.println(i)语句,知道每个调用中i都会递增,因此您看到值的原因:

    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    after recursive
    

    简而言之,这基本上是递归。 : - )

答案 1 :(得分:1)

它会在i=10之前进行递归调用。 i增加到11.然后它停止并开始弹回堆栈,打印i。这就是为什么它从11开始。记住它会在备份的路上检查while循环条件,每次再增加i。这就是它到12,13的原因......

答案 2 :(得分:0)

这是因为你的i变量是在递归变量之外声明的,并且在显示之前你正在递增和递归。不要忘记,i++ < 10将评估i++,即使i的结果为i++ < 10,也会增加false的值。< / p>

如果您手动记下代码执行结果的i++序列,并且在显示i的值时写下来,那么一切都应该清楚。

答案 3 :(得分:0)

当递归调用停止时,控件只到达System.out.println,到那时循环的保护是假的,这意味着在最后一次比较后i > 10i == 10最后比较,但它会后递增)。

答案 4 :(得分:0)

您正在打印i的值。在您的代码中没有任何语句可以减少 i的值。因此,您不应期望看到打印出的值越来越低。

除此之外,将递归保持在全局变量(此处为i)通常是一个坏主意,因为这往往使得很难推断出代码中发生的事情。