亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

遞歸與迭代

遞歸與迭代

說到處都recursion可以使用for循環是否正確?如果遞歸通常較慢,那么將其用于循環迭代的技術原因是什么?并且如果總是有可能將遞歸轉換為for循環,是否有經驗法則?
查看完整描述

3 回答

?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

遞歸通常要慢得多,因為所有函數調用必須存儲在堆棧中,以允許返回到調用者函數。在許多情況下,必須分配和復制內存以實現范圍隔離。


某些優化(例如尾部調用優化)可使遞歸更快,但并非總是可能的,并且并非所有語言都實現。


使用遞歸的主要原因是


當它模仿我們對問題的處理方法時,它在許多情況下更加直觀

某些數據結構(例如樹)更易于使用遞歸進行探索(或者在任何情況下都需要堆棧)

當然,每個遞歸都可以建模為一種循環:這就是CPU最終將要做的事情。遞歸本身更直接地意味著將函數調用和作用域放在堆棧中。但是將遞歸算法更改為循環算法可能需要大量工作,并且會使代碼的可維護性降低:至于每次優化,只有在某些分析或證據表明有必要時才應嘗試進行此嘗試。


查看完整回答
反對 回復 2019-11-23
?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

說在各處使用遞歸都可以使用for循環是否正確?


是的,因為大多數CPU中的遞歸都是使用循環和堆棧數據結構建模的。


如果遞歸通常比較慢,那么使用它的技術原因是什么?


它不是“通常較慢”:遞歸錯誤地應用會較慢。最重要的是,現代編譯器擅長將某些遞歸轉換為循環,而無需詢問。


并且如果總是有可能將遞歸轉換為for循環,是否有經驗法則?


編寫迭代程序,以便在迭代解釋時能最好地理解算法;為算法編寫遞歸程序,最好以遞歸方式進行解釋。


例如,經常以遞歸方式解釋搜索二叉樹,運行快速排序以及解析許多編程語言中的表達式。這些也是最好的遞歸編碼。另一方面,就階乘而言,計算階乘和計算斐波納契數更容易解釋。使用遞歸對他們來說就像是用大錘亂打蒼蠅:這不是一個好主意,即使在大錘它做了很好的工作+。


+我借用了迪克斯特拉(Dijkstra)的“編程學科”中的大錘類比。


查看完整回答
反對 回復 2019-11-23
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

題 :

如果遞歸通常較慢,那么將其用于循環迭代的技術原因是什么?


答:

因為在某些算法中很難迭代求解。嘗試以遞歸和迭代的方式解決深度優先搜索。您會發現很難用迭代來解決DFS。


可以嘗試的另一件好事:嘗試寫Merge進行迭代排序。這將花費您很多時間。


題 :

說在各處使用遞歸都可以使用for循環是否正確?


答:

是。這個線程對此有很好的答案。


題 :

并且如果總是有可能將遞歸轉換為for循環,是否有經驗法則?


答:

相信我。嘗試編寫自己的版本以迭代解決深度優先搜索。您會注意到一些問題更容易遞歸解決。


提示:當您解決可以通過分治法解決的問題時,遞歸非常有用。


查看完整回答
反對 回復 2019-11-23
  • 3 回答
  • 0 關注
  • 709 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號