Re: [問卦] 寫程式會用遞迴 大概是什麼程度?

看板Gossiping作者 (Args&&... args)時間1年前 (2023/02/14 22:42), 編輯推噓6(601)
留言7則, 6人參與, 1年前最新討論串3/3 (看更多)
※ 引述《utomaya (烏托馬雅)》之銘言: : 一個在程式語言界有名的人說了一句話:「遞迴只在天上有,凡人應該用迴圈」 : 可能對方是名人,大家都奉為圭臬 : 我一點都不同意 : 舉個簡單例子好了 : 一個陣列a[]取任意3個,用迴圈怎麼寫? : for(int i=0;i<a.size();i++) : { : for(j=i+1;j<a.size();j++) : { : for(k=j+1;k<a.size();k++) : { : //..... : //以下做特殊處理 : } : } : } 這是保守、安全的寫法 請不要小看它 並且多了解 編譯器的最佳化 也不要小看編譯器最佳化 因為他能幫你優化這個"有限迴圈" 原PO說的遞歸 的確是可以簡化程式不少 讓我想到刷提二元樹反轉的時候 這個很好用 參考: https://tinyurl.com/2p89ndhx 拉回正題 刷提/考試好用 但實際上? 以原PO上一篇說的 當例子 : void recur(int tl, int level, int start) : { : if(level==0) : { : //以下做特殊處理 : // ...... : return; : } : for(int i=start;i<a[].size();i++) : { : recur(tl,level-1,i+1); : } : } : 在最後一層幹掉就好 : 我在ProjectEuler很常用到這種遞迴 我們調用它 int main() { recur(隨便數字, 狗幹大的數字, 隨便數字); } 你編譯通過了 一些機器執行 卻跑出 https://zh.wikipedia.org/wiki/Stack_Overflow 沒錯 鼎鼎大名的stackoverflow 名稱就是這樣來的 你在stackoverflow 還是能找到不少關於 遞歸造成stackoverflow的例子 總之 遞歸慎用 特別是要遞歸很多次 並且你的函式偏複雜 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.24.178.242 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Gossiping/M.1676385774.A.FD1.html

02/14 22:50, 1年前 , 1F
以前不知道call stack的時候很喜歡遞迴
02/14 22:50, 1F

02/14 22:57, 1年前 , 2F
古早人愛用遞迴 某方面是因為容量
02/14 22:57, 2F

02/14 23:02, 1年前 , 3F
現代蠻多上層語言會防呆避免遞迴深度
02/14 23:02, 3F

02/14 23:23, 1年前 , 4F
遞迴的好處就是想法直覺 大拆小一路拆到底 只
02/14 23:23, 4F

02/14 23:23, 1年前 , 5F
要考慮n=1的情況就好
02/14 23:23, 5F

02/15 00:11, 1年前 , 6F
問題是backtracking問題只能用遞迴啊
02/15 00:11, 6F

02/15 10:07, 1年前 , 7F
應該說backtracking用遞迴比較直覺
02/15 10:07, 7F
文章代碼(AID): #1Zwvtk_H (Gossiping)
文章代碼(AID): #1Zwvtk_H (Gossiping)