2015-07-06 90 views
1

請幫助糾正我的理解,這是一個尾調用優化僅適用於遞歸調用。令我困惑的是這個術語只是「尾部呼叫優化」而不是「遞歸尾部呼叫優化」。尾部呼叫優化是否適用於遞歸調用以外的呼叫?

或者是有這種情況發生在一般尾調用,這個術語指的是一些其他的優化?

+1

理論上它可以被用於任何尾調用。但是,自呼叫鏈越深,收穫越多,它通常對遞歸最有用。 – biziclop

回答

3

那將是執行相關的,並且依賴於編譯器 - 但事實是,它可以被用於任何尾調用,不僅是遞歸的。

內聯的方法可以用於任何遞歸調用很容易做到,即使它不是方法本身。

這樣的特別好處是相互遞歸調用:

f(n): 
    //some code 
    g(n) 
g(n): 
    //some more code 
    f(n-1) 

的問題是「什麼和如何優化」,我們應該只是「取消」 G,使˚F遞歸?

幸運的是,這個問題是相對簡單的,並且通過簡單的圖算法solveable,由於這樣的事實,如果每個方法是一個節點 - 它具有至多一個外向邊緣(單尾呼叫)。這意味着該圖實際上是一系列鏈,在「最壞情況」下形成一個簡單循環(每個連接組件中的單個循環),這很容易處理。

+0

您的示例使它看起來像tail-call優化和內聯相同,事實並非如此。當它不包含那個誤導性的例子時,我更喜歡你的答案。 –

+0

@PascalCuoq更正接受。感謝您的反饋。 – amit