這個遞歸函數意味着添加一個整數中所有數字的總和,這是從用戶輸入的。一個例子是整數53將等於8.瞭解一個遞歸函數
int getsum(int n) {
return n == 0 ? 0 : n % 10 + getsum(n/10);
}
我不知道這是如何工作,因爲我是新的遞歸。有人可以向我解釋嗎?謝謝!
這個遞歸函數意味着添加一個整數中所有數字的總和,這是從用戶輸入的。一個例子是整數53將等於8.瞭解一個遞歸函數
int getsum(int n) {
return n == 0 ? 0 : n % 10 + getsum(n/10);
}
我不知道這是如何工作,因爲我是新的遞歸。有人可以向我解釋嗎?謝謝!
沒有三元運算符,這可能會更容易閱讀。
int getsum(int n) {
if(n==0)
{
return 0;
}
else
{
return n%10 + getsum(n/10);
}
}
從這裏您可以看到,對於n = 0,您的總和爲0。
然後使用n%10
和n/10
它將整數分成最後一位數字,其餘部分。
例如552%10 = 2
和552/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
遞歸是重複調用本身的方法,用它的情況下,一個(基礎情況)不調用自身,因此它不會最終調用本身在一個無限循環。
試試你的53
例如:
第一次調用:n
是53
。 n
不是0
,所以n % 10 + getsum(n/10)
被評估。 n % 10
是3`(53除以10的餘數爲3),再加上遞歸調用返回的值。
第二通電話:n
是5
(在Java中,整數除法表示53/10
是5
)。 n
不是0
,所以n % 10 + getsum(n/10)
被評估。 n % 10
是5`(5除以10有餘數5),再加上遞歸調用返回的值。
第三通電話:n
是0
(在Java中,整數除法表示5/10
是0
)。 n
爲0
,因此0
被返回。
剩下的數學運算是3 + 5 + 0
,其產生8
。每個遞歸呼叫處理號碼的一個數字,基本情況(離號碼結束)返回0
,這不影響總和。
其簡單:
打破你的三元操作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
希望這會有所幫助。
用鉛筆和紙「玩電腦」確定火的方式來克服遞歸。 –
我建議你用鉛筆和紙做一段代碼,或者使用你的調試器來做 –
提示 - '%'返回最右邊的數字,'/'將它移除。從3或4位數字開始,從基本案例'n == 0'開始工作。 – ChiefTwoPencils