簡體   English   中英

除尾遞歸之外的尾調用優化?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM