很难理解递归

时间:2016-10-05 22:00:44

标签: java recursion

  public static int fun(int n) {
    if (n<=1) return 1;
    else return (n + fun(n-1));   
  }

为什么fun(6)会返回21

我如何可视化递归如下:

6 + 5 = 11
5 + 4 = 9
4 + 3 = 7
3 + 2 = 5
2 + 1 = 3
1       1
11 + 9 + 7 + 5 + 3 + 1 = 36

有人可以向我解释这里发生了什么吗?

- 编辑删除了System.out.println(),忘记在发布代码时将其删除。

我自己尝试了以下内容:

public static int fun(int n) {
    if (n==1) return 2;
    else return 2 * fun(n-1);   
}

2 * fun(4)
2 * (2 * fun(3))
2 * (2 * (2 * fun(2)))
2 * (2 * (2 * (2 * fun(1))))
2 * 2 * 2 * 2 * 2 = 32

这是可视化的正确方法吗?

4 个答案:

答案 0 :(得分:6)

我认为将其可视化为更简单:

fun(6) =
6 + fun(5) =
6 + 5 + fun(4) =
...
6 + 5 + 4 + 3 + 2 + 1 =
21

基本上每个递归调用使我们向终点移动一步(n <= 1)。只有在达到终止后才能计算最终结果

答案 1 :(得分:6)

fun的每次调用最终都会return n + fun(n-1);。让我们一步一步看看会发生什么。

你致电fun(6) ......

评估为6 + fun(5) ......

评估为6 + (5 + fun(4)) ......

评估为6 + (5 + (4 + fun(3))) ......

评估为6 + (5 + (4 + (3 + fun(2)))) ......

评估为6 + (5 + (4 + (3 + (2 + fun(1))))),自fun(1) = 1以来,

评估为6 + 5 + 4 + 3 + 2 + 1 21

答案 2 :(得分:1)

fun(6) = 6 + fun(5)
       = 6 + 5 + fun(4)
       = 6 + 5 + 4 + fun(3)
       ...
       = 6 + 5 + 4 + 3 + 2 + 1 = 21

答案 3 :(得分:1)

第一行“System.out.println(n +”“+(n-1));”仅显示变量'n'的值,并且不包含任何算术运算。

此功能的步骤:

6> 1 so:6 + fun(5),

5&gt; 1 so:6 + 5 + fun(4),

4> 1 so:6 + 5 + 4 + fun(3),

3> 1 so:6 + 5 + 4 + 3 + fun(2),

2> 1 so:6 + 5 + 4 + 3 + 2 + fun(1),

1> = 1因此:6 + 5 + 4 + 3 + 2 + 1

和SUM:6 + 5 + 4 + 3 + 2 + 1 = 21

我希望我的解释对你有用。