我知道遞回函式會構建堆疊,因為前一個函式正在等待下一次呼叫的回傳,但是沒有型別函式沒有這種依賴性。所以它會構建堆疊嗎?
uj5u.com熱心網友回復:
此處參考的堆疊是“呼叫堆疊”- 顧名思義,它與您正在呼叫的內容(例如引數)相關。回傳值存盤在堆上,呼叫堆疊只是將回傳值的地址存盤到堆中。有關更多資訊,請查看Wikipedia上的文章(有一個很好的圖表供參考,其中包含所有正確的術語)。這個YouTube 視頻也很好地描述了呼叫堆疊。
即使回傳值是null,我們仍然需要存盤一些對它的參考以供呼叫者使用!
讓我們看一下發生的事情的過度簡化:
foo(i) {
if (i == 0) {
return 0
}
return foo(i - 1)
}
讓我們呼叫foo(1),這是呼叫堆疊的簡單視圖:
[TOP OF STACK]
foo(1)
return address of foo(1)
[BOTTOM OF STACK]
然后foo(1) 遞回呼叫foo(0):
[TOP OF STACK]
foo(0)
return address of foo(0)
foo(1)
return address of foo(1)
[BOTTOM OF STACK]
然后foo(0)回傳 0,因此我們開始從呼叫堆疊中彈出:
[TOP OF STACK]
foo(1)
return address of foo(1)
[BOTTOM OF STACK]
由于foo(1)現在已完成,它也回傳,因此我們再次從呼叫堆疊中彈出:
[TOP OF STACK]
[BOTTOM OF STACK]
即使呼叫不是遞回的,也會以類似的方式處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/337468.html
標籤:递归
下一篇:Map不在遞回中存盤值
