3 回答

TA貢獻(xiàn)1900條經(jīng)驗(yàn) 獲得超5個贊
遞歸通常要慢得多,因?yàn)樗泻瘮?shù)調(diào)用必須存儲在堆棧中,以允許返回到調(diào)用者函數(shù)。在許多情況下,必須分配和復(fù)制內(nèi)存以實(shí)現(xiàn)范圍隔離。
某些優(yōu)化(例如尾部調(diào)用優(yōu)化)可使遞歸更快,但并非總是可能的,并且并非所有語言都實(shí)現(xiàn)。
使用遞歸的主要原因是
當(dāng)它模仿我們對問題的處理方法時,它在許多情況下更加直觀
某些數(shù)據(jù)結(jié)構(gòu)(例如樹)更易于使用遞歸進(jìn)行探索(或者在任何情況下都需要堆棧)
當(dāng)然,每個遞歸都可以建模為一種循環(huán):這就是CPU最終將要做的事情。遞歸本身更直接地意味著將函數(shù)調(diào)用和作用域放在堆棧中。但是將遞歸算法更改為循環(huán)算法可能需要大量工作,并且會使代碼的可維護(hù)性降低:至于每次優(yōu)化,只有在某些分析或證據(jù)表明有必要時才應(yīng)嘗試進(jìn)行此嘗試。

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個贊
說在各處使用遞歸都可以使用for循環(huán)是否正確?
是的,因?yàn)榇蠖鄶?shù)CPU中的遞歸都是使用循環(huán)和堆棧數(shù)據(jù)結(jié)構(gòu)建模的。
如果遞歸通常比較慢,那么使用它的技術(shù)原因是什么?
它不是“通常較慢”:遞歸錯誤地應(yīng)用會較慢。最重要的是,現(xiàn)代編譯器擅長將某些遞歸轉(zhuǎn)換為循環(huán),而無需詢問。
并且如果總是有可能將遞歸轉(zhuǎn)換為for循環(huán),是否有經(jīng)驗(yàn)法則?
編寫迭代程序,以便在迭代解釋時能最好地理解算法;為算法編寫遞歸程序,最好以遞歸方式進(jìn)行解釋。
例如,經(jīng)常以遞歸方式解釋搜索二叉樹,運(yùn)行快速排序以及解析許多編程語言中的表達(dá)式。這些也是最好的遞歸編碼。另一方面,就階乘而言,計算階乘和計算斐波納契數(shù)更容易解釋。使用遞歸對他們來說就像是用大錘亂打蒼蠅:這不是一個好主意,即使在大錘它做了很好的工作+。
+我借用了迪克斯特拉(Dijkstra)的“編程學(xué)科”中的大錘類比。

TA貢獻(xiàn)1842條經(jīng)驗(yàn) 獲得超13個贊
題 :
如果遞歸通常較慢,那么將其用于循環(huán)迭代的技術(shù)原因是什么?
答:
因?yàn)樵谀承┧惴ㄖ泻茈y迭代求解。嘗試以遞歸和迭代的方式解決深度優(yōu)先搜索。您會發(fā)現(xiàn)很難用迭代來解決DFS。
可以嘗試的另一件好事:嘗試寫Merge進(jìn)行迭代排序。這將花費(fèi)您很多時間。
題 :
說在各處使用遞歸都可以使用for循環(huán)是否正確?
答:
是。這個線程對此有很好的答案。
題 :
并且如果總是有可能將遞歸轉(zhuǎn)換為for循環(huán),是否有經(jīng)驗(yàn)法則?
答:
相信我。嘗試編寫自己的版本以迭代解決深度優(yōu)先搜索。您會注意到一些問題更容易遞歸解決。
提示:當(dāng)您解決可以通過分治法解決的問題時,遞歸非常有用。
添加回答
舉報