我希望看到尾遞歸優化的影響,並希望以尾遞歸優化方式編寫簡單的階乘函數。 是否有可能在沒有編譯器支持的代碼中執行此操作?C++代碼中的尾遞歸優化
回答
編譯器進行優化。所以沒有編譯器支持就無法測試它。
在代碼中執行此操作的唯一方法是通過迭代替換遞歸(但當然,您將失去遞歸)。
尾遞歸優化將帶尾遞歸屬性的函數轉換爲迭代,爲了在沒有編譯器支持的情況下執行它,您必須手動執行遞歸 - >迭代。請注意,您可能會丟失代碼的可讀性(遞歸函數往往更短,更容易理解),並需要大量代碼更改(從而將您的大腦翻轉出去)。如果我需要這樣做,我通常會將原始遞歸函數放在轉換迭代版本之上的註釋中。
*因此把你的大腦翻出來*這是一個很好的練習:) –
也可以寫一個迭代版本,使它看起來儘可能的像遞歸版本一樣,因此可以很容易理解。基本上在函數頂部放置一個標籤或'while(1)'。用每個函數參數一行代替每個尾遞歸調用'return myfunc(arg1,arg2 ... arg_n);'來設置新的值(如果它不同於當前值),接着是'goto'或'continue '。如果函數不是簡單的尾遞歸,則需要更多的更改,但如果編譯器僅優化簡單的尾遞歸,則需要進行相同的更改。 –
- 1. 在C++中優化遞歸
- 2. PHP是否優化尾遞歸?
- 3. 斯卡拉尾遞歸優化
- 4. 優化非尾遞歸函數
- 5. Memoizing尾調用優化遞歸函數
- 6. 對C語言中的代碼應用尾遞歸?
- 7. 爲什麼尾遞歸優化比Python中的正常遞歸更快?
- 8. 部分尾遞歸函數是否仍然可以獲得完全尾遞歸函數的優化優勢?
- 9. C#代碼優化
- 10. 優化C++代碼
- 11. 優化C++代碼
- 12. C#優化代碼
- 13. 優化C代碼
- 14. Scheme中的遞歸函數總是進行尾調優化?
- 15. Rfactor這個F#代碼到尾遞歸
- 16. 在C和Haskell之間的相互遞歸中編譯尾部調用優化
- 17. 在Scala中可以保證尾遞歸優化嗎?
- 18. scala中沒有尾遞歸優化時堆棧溢出?
- 19. 尾遞歸和迭代SML
- 20. Java尾遞歸:低於斐波那契碼尾遞歸?
- 21. c#編程代碼優化
- 22. 代碼優化asp.net c#
- 23. 優化客觀c代碼
- 24. 優化此C代碼
- 25. 優化遞歸函數
- 26. 優化遞歸函數
- 27. 遞歸postgres SQL優化
- 28. SQL:優化遞歸CTE
- 29. Php遞歸函數優化
- 30. 如何優化visual c#中的代碼?
謝謝。那麼支持尾遞歸優化的編譯器會自動將普通階乘函數轉換爲交互函數,還是我們需要手動提供該函數?例如,Factorial上的尾遞歸版本將具有Factorial(value,accu)函數(http://stackoverflow.com/questions/310974/what-is-tail-call-optimization)。基本上,編譯器會自動完成它,還是需要編譯器以這種方式對編譯器進行優化?謝謝。 – madu
@madu g ++自動執行尾遞歸優化;你不必改變你編寫代碼的方式(至少在像factorial這樣的簡單情況下)。但是,所有編譯器都不是這樣。 –