麻烦跟随递归代码

时间:2017-04-26 04:10:56

标签: java recursion

试图了解此代码的工作原理。假设整数是4,我知道4是针对基本情况检查的,然后该方法再次使用整数3调用自身,然后出现相同的模式,直到整数为1.我的问题是求和部分是如何完成的?最终的结果是什么?

public int sum(int num)
{
   int result;
   if (num == 1)
      result = 1;
   else
      result = num + sum(num-1);
   return result;
}

3 个答案:

答案 0 :(得分:2)

正如我认为您基于帖子意识到的,魔术发生在这里:result = num + sum(num-1);将其视为一系列方法调用。从逻辑上讲,整个过程可以这样表示:

sum(4);

评估为

4 + sum(3);

评估为

4 + 3 + sum(2);

评估为

4 + 3 + 2 + sum(1);

评估为

4 + 3 + 2 + 1

等于

10

答案 1 :(得分:1)

它发生在这里:

result = num + sum(num-1);

一起
return result;

迭代 n 再次调用sum()(触发迭代 n + 1 )。返回 n + 1 的结果;并添加到 n ;给出 n-1 的结果(因为后面的return语句)。

并且记录在案:我没有在答案中包含最终解决方案;因为你可以很容易地自己解决这个问题;通过运行该代码;或者用一支笔和一张纸来运行"这段代码"手动"。

答案 2 :(得分:1)

当递归调用返回堆栈时,会发生求和。见这里:

             sum(4)   # The initial function call
               |
          |---------------|
          | 4 + sum(4-1)  |     # num + recursive call
                  |
              |---------------|
              | 3 + sum(3-1)  |  # the next num + the next recursive call
                      |
                  |---------------|
                  | 2 + sum(2-1)  |
                          |
                        |---|
                        | 1 |    # Base case num == 1

如果使用下面的值填充每个递归sum(...)调用,您会得到什么?总和加起来了。这就是加法发生的地方。

跟踪这一点,找出自己的价值。或者,运行代码。