2013-10-31 102 views
-2

這個遞歸函數意味着添加一個整數中所有數字的總和,這是從用戶輸入的。一個例子是整數53將等於8.瞭解一個遞歸函數

int getsum(int n) { 
    return n == 0 ? 0 : n % 10 + getsum(n/10); 
} 

我不知道這是如何工作,因爲我是新的遞歸。有人可以向我解釋嗎?謝謝!

+0

用鉛筆和紙「玩電腦」確定火的方式來克服遞歸。 –

+0

我建議你用鉛筆和紙做一段代碼,或者使用你的調試器來做 –

+0

提示 - '%'返回最右邊的數字,'/'將它移除。從3或4位數字開始,從基本案例'n == 0'開始工作。 – ChiefTwoPencils

回答

0

沒有三元運算符,這可能會更容易閱讀。

int getsum(int n) { 
    if(n==0) 
    { 
     return 0; 
    } 
    else 
    { 
     return n%10 + getsum(n/10); 
    } 
} 

從這裏您可以看到,對於n = 0,您的總和爲0。

然後使用n%10n/10它將整數分成最後一位數字,其餘部分。

例如552%10 = 2552/10 = 55。然後我們把這個數字加起來,其餘的再次調用這個方法。最終在其中一個調用中,我們將傳遞0。在這種情況下,0立即返回,並且我們開始在所有調用之間返回數字,並將它們一起添加。對於n

程序跟蹤= 552:

getsum(552) 
2 + getsum(55) 
2 + 5 + getsum(5) 
2 + 5 + 5 + getsum(0) 
2 + 5 + 5 + 0 
2 + 5 + 5 
2 + 10 
12 
0

遞歸是重複調用本身的方法,用它的情況下,一個(基礎情況)不調用自身,因此它不會最終調用本身在一個無限循環。

試試你的53例如:

第一次調用:n53n不是0,所以n % 10 + getsum(n/10)被評估。 n % 10是3`(53除以10的餘數爲3),再加上遞歸調用返回的值。

第二通電話:n5(在Java中,整數除法表示53/105)。 n不是0,所以n % 10 + getsum(n/10)被評估。 n % 10是5`(5除以10有餘數5),再加上遞歸調用返回的值。

第三通電話:n0(在Java中,整數除法表示5/100)。 n0,因此0被返回。

剩下的數學運算是3 + 5 + 0,其產生8。每個遞歸呼叫處理號碼的一個數字,基本情況(離號碼結束)返回0,這不影響總和。

1

其簡單:

  1. 打破你的三元操作return n == 0 ? 0 : n % 10 + getsum(n/10);

    if(n == 0) 
        return 0 
    else 
        return n % 10 + getsum(n/10); 
    

正如你可以在你的else語句看到,它的參數再次調用getsum方法n/10,這不過是你的原始號碼,而是單位的數字。 If條件只有在所有數字都用完並且參數變爲0並且在那種情況下它返回0時才被執行。

爲了進一步解釋,讓我們舉一個例子,並進行空運行。說你的號碼是12345。它會這樣工作

1. getsum(12345) 
2. (5 + getsum(1234))    <--From else 
3. (5 + (4+getsum(123)))   <--Again from else 
4. (5 + (4+ (3+ getsum(12))))  <--Again From else 
5. (5 + (4+(3+(2+getsum(1)))))  <--Again From else 
6. (5 + (4+(3+(2+(1+ getsum(0)))))) <--Again From else 
7. (5 + (4+(3+(2+(1+(0))))))  <-- *Return from if, now reverse from stack 
8. (5 + (4+(3+(2+(1))))))   <-- Return step 1 
9. (5 + (4+(3+(3))))    <-- Return step 2 
10. (5 + (4+(6)))     <-- Return step 3 
11. (5 + (10))      <-- Return step 4 
12. (15)        <-- *Final return 

希望這會有所幫助。