2013-10-31 63 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 

希望这会有所帮助。