我一直在嘗試理解呼叫堆疊和遞回函式,但我被困在這里。
在這段代碼中,呼叫堆疊會堆積 6 次,直到 a = 5,此時它會回傳 1 到第 5 個呼叫堆疊。但是在回傳到第 5 個呼叫堆疊后,程式又回到了 main。
其他沒有回傳值的呼叫堆疊呢?呼叫堆疊上的每個函式不是都需要回傳一個值嗎?
public static int func1(int a) {
if (a == 5) {
return 1;
}
return func1(a 1);
}
public static void main(String[] args) {
func1(0);
}
??? ??? ??? ??? ??? ? ??? ??? ??? ??? ??? ??? ??? ???
uj5u.com熱心網友回復:
呼叫堆疊上的每個函式不是都需要回傳一個值嗎?
他們都需要回傳。(Void 函式不需要回傳值,其他一切都需要。)
但是在回傳到第 5 個呼叫堆疊后,程式又回到了 main。
不,您的代碼從一個呼叫回傳,然后是下一個呼叫,然后是下一個呼叫,直到它到達 main。
uj5u.com熱心網友回復:
但是在回傳到第 5 個呼叫堆疊后,程式又回到了 main。
這是不正確的。堆疊展開:第 5 次呼叫回傳一個值給第 4 次呼叫,第 4 次呼叫回傳一個值給第 3 次呼叫,直到所有堆疊幀都被決議并且最終結果回傳到main.
事實上,由于您撰寫代碼的方式,呼叫甚至不會立即回傳!每個都從遞回呼叫中檢索回傳值,然后添加 1,然后才回傳,因此在第 5 幀完成后的第 4 幀內會發生更多計算,依此類推。
uj5u.com熱心網友回復:
其他沒有回傳值的呼叫堆疊呢?呼叫堆疊上的每個函式不是都需要回傳一個值嗎?
實際上不,正如@Sweeper 所說,void 方法,例如,不回傳值。如果 Java 的行為與 Python 類似,則函式默認回傳 null 型別。
但呼叫堆疊在您的情況下正常執行。回傳值僅由函式呼叫處理。它執行如下:
- main() 呼叫 func(0)
- func(0) 呼叫 func(0 1)
- func(0 1) 呼叫 func(0 1 1)
- func(0 1 1) 呼叫 func(0 1 1 1)
- func(0 1 1 1) 呼叫 func(0 1 1 1 1)
- func(0 1 1 1 1) 呼叫 func(0 1 1 1 1 1)
- func(0 1 1 1 1 1) 回傳 5 給 func(0 1 1 1 1)
- func(0 1 1 1 1) 回傳 5 給 func(0 1 1 1)
- func(0 1 1 1) 回傳 5 給 func(0 1 1)
- func(0 1 1) 回傳 5 給 func(0 1)
- func(0 1) 回傳 5 func(0)
- func(0) 將 5 回傳給 main()
- main() 回傳 5
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/523567.html
標籤:爪哇递归调用栈
下一篇:讀取空白輸入甚至數字輸入
