如何在这个简短的递归示例中存储,调用和添加数字?

时间:2016-03-04 16:27:21

标签: java recursion

首先,这不是功课。我正在练习http://codingbat.com/java/Recursion-1的例子。每次我认为我开始理解递归时,我遇到一个让我意识到我不知道的问题,导师或互联网解释所说的唯一的事情是“该函数调用自己直到基本情况得到满足。 “

public int sumDigits(int n) {
   if(n < 10) {
      return n;
   } else return sumDigits(n/10) + n % 10;
}

如果我在计算机上将115传递给它,输出为7(应该如此),但我不明白程序是如何得出这个结论的。我就是这样看的:

115不小于10,所以以115/10(即11)返回程序。 11不小于10,所以以11/10(即1)返回程序。将其添加到115%10(即5)。那么这个程序如何获得7 ???

似乎无论我看多少个例子,我都找不到一个如何运作的模式。

3 个答案:

答案 0 :(得分:1)

如果您交换+的两个操作数,也就是将其更改为读取,您可能会发现更容易推理此代码:

return (n % 10) + sumDigits(n / 10)

sumDigits(115) = 5 + sumDigits(11)
 sumDigits(11) = 1 + sumDigits(1)
  sumDigits(1) = 1

如此扩展:

sumDigits(115) = 5 + (1 + sumDigits(1))
               = 5 + 1 + 1
               = 7

答案 1 :(得分:1)

以下是用图表

解释的

enter image description here

答案 2 :(得分:0)

你几乎是正确的,退回递归时只错过了一步 - 从11/10返回时,你又添加了另一个1

  • 要求115
    • 115&gt; 10,递归调用11
      • 11&gt; 10,递归调用1
        • 1&lt; 10,返回1
      • 从递归调用返回1 + 11%10 = 1 + 1 = 2
    • 从递归调用返回2 + 115%10 = 2 + 5 = 7