我意識到這個問題的答案可能會因不同的語言而異,而我最感興趣的語言是C++。如果標籤需要更改,因爲這不能用與語言無關的方式回答,請隨時取消。 部分尾遞歸函數是否仍然可以獲得完全尾遞歸函數的優化優勢?
是否有可能有一個函數是部分尾遞歸,並仍然有任何優勢,尾遞歸會得到你?
據我所知,尾遞歸不是完成一個完整的函數調用,編譯器會優化函數,只是將參數更改爲新參數並跳轉到函數的開頭。
如果你有這樣的功能:
def example(arg):
if arg == 0:
return 0 # base case
if arg % 2 == 0:
return example(arg - 1) # should be tail recursive
return 3 + example(arg - 1) # isn't tail recursive because 3 is added to the result
當優化器遇到類似的東西(其中函數是尾遞歸在某些情況下,而不是在其他人)將它打開一進一出jump
而另一個變成call
,或者將一些優化現實的事實(如果我知道它我不會問),它必須把所有變成call
,並且失去了如果函數是尾隨函數時會產生的所有效率,遞歸?
是的,我知道我可以改變它在無條件尾部遞歸的地方,但我想舉一個我正在談論的例子。是的,我很確定C++(至少MSVC++)可以將相互遞歸函數轉換爲尾調用。 –
CPython實現*從不*優化尾部呼叫,而且Guido已將他的觀點放在了主題上,稱它爲「unpythonic」。見http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html –
@Dietrich是啊,我注意到這一點,當我試着本應該是一個尾遞歸析因函數:)太糟糕了guido是如此目光短淺。 –