[英]Recursive Outputs
這是我對遞歸問題的以下代碼
有人可以讓我了解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);
}
}
}
您有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
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
此遞歸采用自下而上的方法。 在獲得其他遞歸調用的值之前,首先要最深入地找到基本案例的值。
這就是為什么輸出 = 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.
您不是遍歷值,而是將它們全部加起來。
這是因為您使用的是recCall(++num)
,並且使用的是pre-increment
運算符,該運算符會在調用方法之前增加值。
請閱讀++預遞增在Java中的工作原理:- 后遞增(i ++)和預遞增(++ i)運算符在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。
是的,如果您嘗試移動召回(++ num)並放置新的數字++num
,則結果將為= 2 * 3 * 4
,在5中它將返回1,因此2 * 3 * 4* 1
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.