2014-12-13 95 views
1

所以我在Java教科書中找到了這段代碼,它是一段遞歸代碼。我真的不明白什麼時候什麼都沒有返回(「返回」),它也沒有在教科書中解釋。我試圖在互聯網上搜索它,但也找不到任何答案。Java返回Nothing遞歸

public static void numbers(int n) { 
    if (n == 0) { 
     throw new IllegalArgumentException(); 
    } 
    if (n == 1) { 
     System.out.print(n); 
     return; 
    } 
    numbers(n - 1); 
    System.out.print(", " + n); 
} 

回答

1

n是1它打印n(1),然後停止遞歸(該return;展開棧幀,並返回到調用者)。在這種情況下,這是當n爲2。然後,該方法結束體(相當於return;),所以它再次(3)反應...

0

即(實施例)的目的的方法是打印一個數。它不是爲了返回任何東西而設計的。

我真的不明白什麼時候什麼都沒有返回(「返回」),並沒有在教科書中解釋。

那麼......什麼「發生」是什麼都沒有返回。

但這樣可以,因爲recursion方法被聲明爲void方法。事實上,如果確實嘗試返回一個值,或者分配調用的結果,那麼會出現編譯錯誤。 (試試吧,看看!)

請注意,這適用於Java中的所有方法/方法調用,而不僅僅是遞歸的。


(這很有可能不會在你的課本解釋這一點,但在一個比前面的章節中,你在看現在。課本一般都寫上,你會讀從文的假設開始...)

1

雖然代碼不是return什麼,但它確實採取了一些操作來改變事情,在這種情況下,將某些東西打印到輸出中。

如果n是1,它只是打印1

如果n是2,則它調用numbers(1)。如上所述,打印1。然後它返回給調用者,即numbersn==2。來電者以numbers(n-1)之後的聲明開始,因此打印, 2。因此,輸出是1, 2

如果n是3,則它調用numbers(2)。如前一段所述,使用另一個遞歸調用輸出1, 2。然後它返回到調用者與n==3。來電者以numbers(n-1)後面的語句開頭,因此打印, 3。因此,輸出是1, 2, 3

因此,基本上,的numbers(n)的輸出(用於n> 1)是numbers(n-1)只是輸出,用逗號和之後n

0

「return;」在void函數中具有與「return val;」相同的含義在一個非void函數中。 所以,「回報」在這個例子中的意思是「在這裏函數結束,並返回到函數調用的調用位置。」 你也可以這樣認爲:在每一個無效函數的末尾都有一個「返回」,但爲簡明起見,它們總是被忽略掉。

0

此方法的目的是打印由逗號分隔的1到n的數字序列,而不是將任何內容返回給其調用者。 因此,這裏是它如何工作正常(嘗試在你的頭上,模擬 - I號線,方便我引用。):

1: public static void numbers(int n) { 
2: if (n == 0) { 
3:  throw new IllegalArgumentException(); 
4: } 
5: if (n == 1) { 
6:  System.out.print(n); 
7:  return; 
8: } 
9: numbers(n - 1); 
10: System.out.print(", " + n); 
11: } 

如果用1作爲參數(N = 1),表達叫它在第5行是真的,第6行向輸出打印「1」,並且該方法在第7行返回給其調用者。
如果以2作爲參數調用它,第5行中的表達式失敗,if塊被跳過,第9行調用n-1(= 1)作爲參數的數字方法,導致顯示「1」(如所示在前一種情況下)。 CPU然後返回到它的調用者並繼續執行第10行,它將「,2」輸出到輸出。最終的輸出是「1,2」。
如果以3作爲參數調用它,第9行調用數字方法,以2爲參數,導致輸出「1,2」(如前面的例子所示),然後打印「,3」(在第10行) ,導致「1,2,3」作爲輸出。
依此類推...