理解递归函数

时间:2013-10-31 20:30:15

标签: java function methods recursion sum

此递归函数用于将整数中所有数字的总和添加到用户输入的整数中。一个例子是整数53等于8。

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

我不知道这是如何工作的,因为我是递归的新手。有人可以向我解释一下吗?谢谢!

3 个答案:

答案 0 :(得分:1)

简单:

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

     if(n == 0)
        return 0
     else
        return n % 10 + getsum(n/10);
    
  2. 正如您在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%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

答案 2 :(得分: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)。 <{1}}为n,因此会返回0

剩下的数学运算是0,产生3 + 5 + 0。每个递归调用处理该数字的一个数字,基本情况(在数字的末尾)返回8,这不会影响总和。