这个递归函数意味着添加一个整数中所有数字的总和,这是从用户输入的。一个例子是整数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