2016-02-21 129 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次。