請幫助糾正我的理解,這是一個尾調用優化僅適用於遞歸調用。令我困惑的是這個術語只是「尾部呼叫優化」而不是「遞歸尾部呼叫優化」。尾部呼叫優化是否適用於遞歸調用以外的呼叫?
或者是有這種情況發生在一般尾調用,這個術語指的是一些其他的優化?
請幫助糾正我的理解,這是一個尾調用優化僅適用於遞歸調用。令我困惑的是這個術語只是「尾部呼叫優化」而不是「遞歸尾部呼叫優化」。尾部呼叫優化是否適用於遞歸調用以外的呼叫?
或者是有這種情況發生在一般尾調用,這個術語指的是一些其他的優化?
那將是執行相關的,並且依賴於編譯器 - 但事實是,它可以被用於任何尾調用,不僅是遞歸的。
內聯的方法可以用於任何遞歸調用很容易做到,即使它不是方法本身。
這樣的特別好處是相互遞歸調用:
f(n):
//some code
g(n)
g(n):
//some more code
f(n-1)
的問題是「什麼和如何優化」,我們應該只是「取消」 G,使˚F遞歸?
幸運的是,這個問題是相對簡單的,並且通過簡單的圖算法solveable,由於這樣的事實,如果每個方法是一個節點 - 它具有至多一個外向邊緣(單尾呼叫)。這意味着該圖實際上是一系列鏈,在「最壞情況」下形成一個簡單循環(每個連接組件中的單個循環),這很容易處理。
您的示例使它看起來像tail-call優化和內聯相同,事實並非如此。當它不包含那個誤導性的例子時,我更喜歡你的答案。 –
@PascalCuoq更正接受。感謝您的反饋。 – amit
理論上它可以被用於任何尾調用。但是,自呼叫鏈越深,收穫越多,它通常對遞歸最有用。 – biziclop