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
这是可视化的正确方法吗?
答案 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
我希望我的解释对你有用。