2011-10-05 168 views
0

我希望看到尾遞歸優化的影響,並希望以尾遞歸優化方式編寫簡單的階乘函數。 是否有可能在沒有編譯器支持的代碼中執行此操作?C++代碼中的尾遞歸優化

回答

3

編譯器進行優化。所以沒有編譯器支持就無法測試它。

在代碼中執行此操作的唯一方法是通過迭代替換遞歸(但當然,您將失去遞歸)。

+0

謝謝。那麼支持尾遞歸優化的編譯器會自動將普通階乘函數轉換爲交互函數,還是我們需要手動提供該函數?例如,Factorial上的尾遞歸版本將具有Factorial(value,accu)函數(http://stackoverflow.com/questions/310974/what-is-tail-call-optimization)。基本上,編譯器會自動完成它,還是需要編譯器以這種方式對編譯器進行優化?謝謝。 – madu

+0

@madu g ++自動執行尾遞歸優化;你不必改變你編寫代碼的方式(至少在像factorial這樣的簡單情況下)。但是,所有編譯器都不是這樣。 –

2

尾遞歸優化將帶尾遞歸屬性的函數轉換爲迭代,爲了在沒有編譯器支持的情況下執行它,您必須手動執行遞歸 - >迭代。請注意,您可能會丟失代碼的可讀性(遞歸函數往往更短,更容易理解),並需要大量代碼更改(從而將您的大腦翻轉出去)。如果我需要這樣做,我通常會將原始遞歸函數放在轉換迭代版本之上的註釋中。

+1

*因此把你的大腦翻出來*這是一個很好的練習:) –

+0

也可以寫一個迭代版本,使它看起來儘可能的像遞歸版本一樣,因此可以很容易理解。基本上在函數頂部放置一個標籤或'while(1)'。用每個函數參數一行代替每個尾遞歸調用'return myfunc(arg1,arg2 ... arg_n);'來設置新的值(如果它不同於當前值),接着是'goto'或'continue '。如果函數不是簡單的尾遞歸,則需要更多的更改,但如果編譯器僅優化簡單的尾遞歸,則需要進行相同的更改。 –