我有一個關于遞回的問題。每當在遞回中遇到一個基本條件時,我們就會停止進行遞回呼叫,然后堆疊中的方法呼叫會繼續執行,并被逐一從記憶體堆疊中彈出。
我的問題是,一旦我們達到了這個基本條件,現在就不再有遞回呼叫了,那么當我們執行堆疊中的第一個方法呼叫時,行程如何知道它不必再呼叫這個方法而必須執行它并將它從堆疊記憶體中彈出?
例如,讓我們看看這段代碼
。
private static String reverse(String str){
if(str.equals(""/span>)) {
return ""。
}
return reverse(str.substring(1)) str.charAt(0)。
}
輸入:我的名字是slim shady
輸出:ydahs mils si eman ym
當我們做字串反轉時,現在的基本條件是如果字串是空的,那么就不需要呼叫相同的方法,但是一旦我們碰到這個基本條件,堆疊中就會有方法呼叫reverse("o") "l"。就像在這個圖片中
行程如何知道它必須執行該方法并跳出,而不是進行另一個遞回呼叫?因為這個方法 reverse("o") "l" 看起來像是另一個呼叫,而不是執行它并從記憶體中彈出。
uj5u.com熱心網友回復:
我認為你對每個遞回呼叫如何被推送到堆疊的思考是錯誤的。因為你的問題暗示著每個遞回呼叫仍然可以選擇進行另一個遞回呼叫。
就像你說的,函式將呼叫自己,直到它達到基數情況。每次發生這種情況時,堆疊會將變數保存到當前的堆疊框架中,本質上是保存狀態并遞增堆疊指標。請注意,所有這些呼叫仍在堆疊中。
當你打到基本情況時,一個變數被回傳,這意味著當前堆疊幀可以被彈出,堆疊指標可以被遞減。由于我們有一個遞回呼叫的回傳值,之前的遞回呼叫(已經進行了遞回呼叫)可以完成加法操作并回傳。
所以你的問題的答案是每個人都創建并保存一個狀態,這個狀態依賴于下一個遞回狀態的完成,以便它能夠完成。
uj5u.com熱心網友回復:
不要認為堆疊上有代碼片段,而是一個程式計數器,它將在方法的某個特定點恢復執行。
我們可以將reverse(str.substring(1)) str.charAt(0)像這樣分割(這也是它被編譯后的大致樣子):
tmp = reverse(str.substring(1))。
tmp = tmp str.charAt(0);
return tmp。
當呼叫reverse()時,推入堆疊的程式計數器將指向tmp = tmp str.charAt(0);,因此,當遞回呼叫回傳時,執行將在這里繼續。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/319333.html
標籤:
上一篇:到達m*n矩陣底部的所有可能路徑
下一篇:使用遞回法合并兩個串列

