为什么我得到这个输出?我希望输出为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);
}
}
}
答案 0 :(得分:2)
简单的逻辑如下:
由于您的增量是posfix increment,因此在增量之前首先评估原始值。
逻辑:
while (i++ < 10) { recursive();}
i
最初为0
,因此,0 < 10
(真),增加1.现在,请致电recursive()
。这循环(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 > 10
(i == 10
最后比较,但它会后递增)。
答案 4 :(得分:0)
您正在打印i
的值。在您的代码中没有任何语句可以减少 i
的值。因此,您不应期望看到打印出的值越来越低。
除此之外,将递归保持在全局变量(此处为i
)通常是一个坏主意,因为这往往使得很难推断出代码中发生的事情。