此递归函数用于将整数中所有数字的总和添加到用户输入的整数中。一个例子是整数53等于8。
int getsum(int n) {
return n == 0 ? 0 : n % 10 + getsum(n/10);
}
我不知道这是如何工作的,因为我是递归的新手。有人可以向我解释一下吗?谢谢!
答案 0 :(得分: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
希望这有帮助。
答案 1 :(得分:0)
如果没有三元运算符,这可能更容易阅读。
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
答案 2 :(得分:0)
递归是一种反复调用自身的方法,其中一种情况(基本情况)不会调用自身,因此它最终不会在无限循环中调用自身。
让我们试试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
)。 <{1}}为n
,因此会返回0
。
剩下的数学运算是0
,产生3 + 5 + 0
。每个递归调用处理该数字的一个数字,基本情况(在数字的末尾)返回8
,这不会影响总和。