这是我对递归问题的以下代码
是否有人能够告诉我输出结果是24?
为了证明我有多困惑,我认为输出将是6,12,20,1
package Examples;
public class QuestionDemo {
public static void main(String[] args) {
System.out.println(recCall(2));
}
public static int recCall(int num) {
if (num == 5) {
return 1;
} else {
return num * recCall(++num);
}
}
}
答案 0 :(得分:2)
你有4个递归调用 第一个你打电话给recCall(2) 然后recCall(3),recCall(4)和recCall(5) recCall(5)返回1 recCall(4)返回4 * 1 recCall(3)返回3 * 4 * 1 recCall(2)返回2 * 3 * 4 * 1 = 24
答案 1 :(得分:2)
recCall(int num):
recall(2)
| |
2 * recall(3)
| |
3 * recall(4)
| |
4 * recall(5)
|
1
recall(2) = 24
| |
2 * 12 = 24
| |
3 * 4 = 12
| |
4 * 1 = 4
|
1
答案 2 :(得分:1)
此递归采用自下而上方法。首先要深入找到基本案例的值,然后才能获得其他递归调用的值。
这就是您获得输出 = 24:
的原因 _
/|\
/ | \
recCall(4) = 4 * recCall(5) = 4 + / | \ // recCall(5) is your base case.
recCall(3) = 3 * recCall(4) = 12 + |
----------------------------------- |
recCall(2) = 2 * recCall(3) = 24 | // This was your first call to the recursive function.
您不会遍历值,而是添加全部。
答案 3 :(得分:1)
因为您正在使用recCall(++num)
,并且您正在使用pre-increment
运算符,它会在调用方法之前增加值。
请阅读++ pre increment如何在java中工作: - How do the post increment (i++) and pre increment (++i) operators work in Java?
所以你的递归调用将如下所示
f(2)= 2*f(3)=2*12 = 24.
f(3)=3*f(4)= 3*4=12
f(4)=4*f(5) = 4*1
f(5)= 1
因此它返回24。
答案 4 :(得分:0)
是的,如果您尝试移动召回(++ num)并将新号码设为++num
,那么结果将为= 2 * 3 * 4
,而在5中它将返回1,因此{{1} }。