2016-02-21 66 views
0

我有这样的疑问, 1)下面的程序运行时显示的任务:if/else语句显示

class Q1 
    { 
     public static void main(String[] args) 
     { 
      r(3); 
     } 
     public static void r(int x) 
     { 
      if (x == 1) 
      { 
      System.out.println("hello"); 
      r(10); 
      } 
      else 
      if (x == 9) 
      System.out.println("bye"); 
      else 
      { 
      System.out.println("good"); 
      r(x-1); 
      System.out.println("bad"); 
      } 
     } 
    } 

,并在我的逻辑,其结果必然是

good 
good 
hello 
good 
bye 

但答案是

good 
good 
hello 
good 
bye 
bad 
bad 
bad 

为什么这些坏的底线出现? 当最后一个r(9)被分配给x时,程序遇到if(x == 9)语句,所以它应该停止,这就是我的想法。

请帮我弄清楚这里的过程和逻辑! 我很困惑...

回答

0

你的R(x)的方法调用:

argument| x=1 | x=9 | other 
--------+--------+------+-------------- 
    code | hello | bye | good 
     | r(10) |  | r(x-1) 
     |  |  | bad 

所以你的调用看起来像

r(3);

good 
r(2); //because r(3-1) 
bad 

其中r(2);调用:

good 
r(1); //because r(2-1) 
bad 

其中r(1);调用:

hello 
r(10); 

其中r(10);调用:

good 
r(9); //because r(10-1) 
bad 

其中r(9);调用:

bye 

如果这些窝,你会得到

r(3){ 
    good 
    r(2){ 
    good 
    r(1){ 
     hello 
     r(10){ 
     good 
     r(9){ 
      bye 
     } 
     bad 
     } 
    } 
    bad 
    } 
    bad 
} 

它生成:

 (from) 
good r(3) 
good  r(2) 
hello  r(1) 
good   r(10) 
bye    r(9) 
bad   r(10) 
bad  r(2) 
bad  r(3) 
+0

谢谢。现在,我明白了。 – learnerJ

0

你错过了一些程序执行的部分,当r是3,2和10时,程序打印'good',然后递归调用r(2),r( 1)和r(9)。但是,还有一个语句,当被调用的递归函数完成其工作并返回到调用方法时,它最终会被执行。当r分别为10,2和3时,该部分将打印出'坏'。

0

在else块:

else{ 
     System.out.println("good"); 
     r(x-1); 
     System.out.println("bad"); 
     } 

即使你调用R(X-1)递归,有没有在退出程序或阻止R()方法无法完成与该方法下一行你的印刷品从运行中“坏”。

0

您正在递归调用r()。在第一次迭代,你到最后的东西,在这里你:

  1. 打印 “好”
  2. 减小量X 1 //(X =二)
  3. 呼叫R(2)

因为R(2)被调用时,你原来于r调用(3)被放置在堆栈中,它将继续在执行:

打印 “坏”

当r(2)返回控制时

沿着递归调用的相同逻辑。

0

给出函数r(int x)和main。

首先启动与函数调用:

r(3); 

由于x不等于1或图9中,程序打印 “好”,并调用R(2);

这同样的逻辑再次发生,所以程序打印“好”,并调用r(1);

在函数调用r(1); x = 1,程序打印“hello”并调用r(10);对于r(10)发生与第一个r(3)和r(2)相同的逻辑,所以程序打印“good”并调用r(9)。

当r(9)被调用时,程序打印“再见”并且不调用r(x)。

在这一点上,程序从r(x)被调用的地方继续。

在r(x)的3个调用中,x不等于9或1.所以程序打印“bad”3次。