我相信所有具有迭代邏輯的問題都可以使用迭代來解決,但是我們可以使用遞歸解決任何問題嗎?遞歸總是可以替代迭代嗎?如果可以的話,請提供您的答案的證明。還假設我們有一個無限的堆棧,或者我們在圖靈機上運行程序。我不在乎這個證明是否是一個理論證明。 (這就是我提到圖靈機的原因)遞歸與迭代
Q
遞歸與迭代
5
A
回答
7
是的,遞歸總是可以代替迭代,這已經討論了before。從鏈接文章中引用:
因爲您可以使用嚴格迭代結構和僅使用遞歸結構的Turn完成語言來構建圖靈完全語言,因此這兩者因此是等效的。
解釋一下:我們知道任何可計算的問題都可以通過圖靈機來解決。並且可以構建一個編程語言A
而不用遞歸,這相當於一個圖靈機。類似地,可以在沒有迭代的情況下構建編程語言B
,其計算能力等於圖靈機。
因此,如果A
和B
都是Turing-complete,我們可以得出結論,對於任何迭代程序,都必須存在等價的遞歸程序,反之亦然。這是一個理論結果,因爲它不會給你任何關於如何從任意迭代程序導出一個遞歸程序的暗示,反之亦然。
+0
謝謝我在搜索該網站時錯過了此鏈接 – 2012-04-14 18:37:02
3
是的。有一種稱爲tail recursion的遞歸類型,可以直接翻譯爲迭代。一個可以轉換成另一個沒有任何問題。因此,所有迭代解決方案都可以轉換爲遞歸解決方案。實際上,許多編譯器可以檢測到您正在執行尾遞歸,然後將其轉換爲for循環類型的代碼以提高效率。
0
當不需要循環時應使用遞歸,但在某種情況下該方法必須重複。例如,壓縮文件夾。如果有一個子文件夾,它應該自己調用(遞歸)。遞歸可以替代迭代,如果你想,但不建議。大多數人只是使用迭代,只在需要時才使用遞歸。
相關問題
- 1. Java迭代與遞歸
- 2. 遞歸與迭代在C#
- 3. 遞歸迭代
- 4. 遞歸迭代
- 5. 遞歸和迭代
- 6. 遞歸 - >迭代
- 7. Ocaml - 迭代遞歸
- 8. 遞歸,尾遞歸和迭代
- 9. 尾遞歸與迭代算法
- 10. 標準ML:迭代與遞歸
- 11. for循環遞歸迭代
- 12. 談到迭代到遞歸
- 13. 迭代轉換的遞歸
- 14. 遞歸到迭代 - 重構
- 15. Java:遞歸迭代映射
- 16. 在Java中遞歸迭代
- 17. 從遞歸進行迭代
- 18. 尾遞歸和迭代SML
- 19. 階乘遞歸和迭代
- 20. 遞歸到迭代轉換
- 21. 遞歸迭代 - 或優化?
- 22. 迭代/遞歸問題?
- 23. 迭代器的Python遞歸
- 24. 方案尾遞歸/迭代
- 25. 無遞歸迭代陣列
- 26. 遞歸迭代(在Python樹)
- 27. 用遞歸Python代替迭代Python
- 28. 將遞歸轉換爲迭代代碼
- 29. 將返回2遞歸的遞歸函數轉換爲迭代
- 30. PHP遞歸迭代器:當前數組迭代的父鍵?
有人可能在這裏糾正我,但不是一些語言(「純功能性語言」)*完全基於遞歸?例如,Lisp語言? – 2012-04-14 18:36:32
@TonyR Lisp語言根本不是純粹的功能。 – 2012-04-14 18:37:59
那麼「功能語言」怎麼樣? – 2012-04-14 18:39:04