2017-04-06 145 views
0

以下是我對AP計算機科學問題的修改。 書上說應該打印0010我認爲它應該打印0010012 但實際上下面的代碼打印3132123Java - 遞歸

這是怎麼回事? 另外它似乎沒有任何停止條件?

public class Mystery { 

    public static void main(String[] args) { 
     int n; 
     n = 3; 
     mystery(n); 
    } 

    public static void mystery(int n) { 
     int k; 
     for (k = 0; k < n; k++) { 
      mystery(k); 
      System.out.print(n); 
     } 
    } 
} 

實際問題顯示爲: 請考慮以下方法。

public void mystery (int n) 
{ 
    int k; 
    for (k=0 ; k < n ; k++) 
    { 
      mystery(k); 
      System.out.print(n); 
    } 
} 

呼叫神祕(3)返回什麼值?

我現在明白循環形成停止條件,我想我理解jhamon的評論「最後的指令是打印n。n是3,沒有辦法只打印'0010012'」但我不明白爲什麼書上說,應該從我所看到的打印00100123.

由於Batsheba說,我已經試過看着變量在調試,但書上說應該打印00100123. 非常感謝jhamon對更正後的代碼,所以這本書是錯的?

+1

最後的指令是打印'n'。 ''n'is 3,沒有辦法只打印'0010012' – jhamon

+3

'它也沒有任何停止條件嗎?!'它有一個:'k BackSlash

+1

回答

1

該程序不能打印「0」。它打印n,如果n爲0,它將永遠不會到達System.out.print(n)行。該行位於for陳述內,其中k<n

正如其他人在評論中指出的那樣,for循環中的條件也是停止條件。 mystery將遞歸調用自己n次。但是,在每個調用中,參數都較小。
(爲了好玩,嘗試將條件改爲k <= n。然後它不會終止,因爲參數小於或等於)。

如果將行更改爲print(k),這可能是預期的,它確實會打印「0010012」。 這是一個ideone link來表明。

+1

將印刷品放在印花織物外面,並獲得書中給出的結果。這裏是你的ideone的一個分支[http://ideone.com/1s1YYt](http://ideone.com/1s1YYt) – jhamon

+0

@jhamon好找!順便說一句,你應該編輯評論。有一個「)」應該有一個「]」,打破了這個聯繫。 –