[英]Tail call optimization besides tail recursion?
除了尾遞歸之外,還有可能進行尾調用優化嗎? 我一直試圖找到或想到一個不涉及遞歸的,但沒有成功。 可能嗎? 任何例子?
當然,“尾部調用優化”實際上是這種優化的術語,以其最普遍的,遞歸不可知的形式。 此優化不會使用等效的while
循環或類似的東西替換遞歸。 而是轉換尾部調用,以便重新使用調用者的堆棧幀。 任何形式的代碼都return f(...)
或f(...); return
f(...); return
可以修改。 它適用於任何 f
,甚至是函數指針/閉包/虛擬方法,其中編譯器不可能知道被調用的內容。 因此,它也可以更好地與單獨的編譯,高階函數,后期綁定等。
如果你看一下足夠多的代碼,無論是功能性的還是命令式的,你都會偶爾看到一些沒有任何代碼的電話。 一個常見的情況是,調用者委托被調用者執行主任務,並且只做一些額外的准備工作。 在功能代碼中,你經常會發現許多小函數只做一件事並且是用其他小函數實現的,所以你最后應用了一些簡單的轉換到參數,然后執行一個尾調用。下一層(將轉換后的數據作為參數)。 TCO優化了第二步,它(理想情況下)使得調用像簡單的jump
一樣便宜,並使得漂亮的模塊化代碼占用的堆棧空間比單片實現更少。 在面向對象的設計中,您可能希望組合其他對象的對象並公開委派的便捷方法:
SomeClass doSomething(Argument a) {
log.debug("Doing something");
return this.somethingDoer.doIt(a, this.someExtraData);
}
另一個技術上相互遞歸的例子,但通常只有很少的任何給定函數的激活(其間有數十或數百個其他激活),是通過每個狀態具有一個函數並調用它進入該狀態來實現的狀態機:
void stateA() {
// do actual work
// determine which transition applies
stateB();
}
void stateB() {
// do actual work
// determine which transition applies
state...();
}
// dozens, possibly hundreds of other states
int bar(int x);
int foo(int x) { return bar(x); }
foo
可以簡單地跳轉到直接返回調用者的bar
; 任何地方都不需要遞歸。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.