作者ripple0129 (perry tsai)
看板Soft_Job
標題[討論] 遞迴要如何鍛鍊
時間Sat Aug 20 19:34:37 2016
To Iterate is human, to recurse, divine.
遞迴真的有點難懂,
雖然效率較低,
常常stack overflow,
不過一些程式碼硬要寫成迴圈,
似乎可讀性會降低。
大家覺得遞迴是很吃天份的東西嗎,
怎樣的鍛鍊方式能夠讓使用遞迴得心應手?
小弟是個費式數列都寫不出來的遞迴白癡,
有請大大分享心得。
或是建議不要寫遞迴這種鬼東西?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.140.222.79
※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1471692879.A.0C1.html
→ yotsuba1022: Then I think you should be a human. 08/20 19:42
→ profiles: 想練遞迴,可用LISP語言 08/20 19:44
→ kurakidream: 實務上沒人在用遞迴 08/20 19:44
→ kurakidream: 不過拿來練習思考是不錯的 08/20 19:45
→ Eleina: 遞迴就像金門沙堆中的炸彈 炸死無辜接手的後人 08/20 19:56
→ manaup: 遞迴很基本好嘛 有些程式叫我改寫成迴圈版本我還要想一下 08/20 19:58
推 OoShiunoO: 之前再看Functional programming in scala 08/20 20:00
→ OoShiunoO: 就是強制要你練習不要用迴圈 習慣了就好 08/20 20:01
→ testPtt: 還有goto可以用 08/20 20:04
推 O187: 沒人用? findcontrol表示 08/20 20:12
推 drajan: 寫題目 例如leet code 試著用遞迴去解 08/20 20:25
推 kyleJ: 確定深度不會太深的時候遞迴很好用啊 08/20 20:45
推 johnny94: 畢業許久,我到河內塔還是搞不懂… 08/20 21:03
→ SoftMen: 哪裡沒人用? 只是你剛好用不到吧 08/20 21:06
→ kurakidream: 若call stack不深,且能增加可讀性是不錯的 08/20 21:14
推 yyc1217: 的確很久沒用過遞迴了 迴圈的可讀性比較高 08/20 21:31
→ freeunixer: 寫個 merge 跟 quick sort 迴圈版來看看就好,寫死你.. 08/20 21:43
→ pttworld: 開發速度的差別。 08/20 21:44
→ freeunixer: 費式數的遞迴都寫不出來,那演算法,計算理論都 bye 了. 08/20 21:45
→ freeunixer: 簡單的遞迴並不難學會,方法如下: 08/20 21:46
推 ken1325: 08/20 21:54
推 sing10407: 08/20 21:56
→ johnny94: f(a){if(a == 0) return else f(--a)} 08/20 21:59
推 shaform: 嫩嫩我迴圈,大大你遞迴 08/20 22:04
→ viper9709: 不要用遞迴+1 08/20 23:21
推 CoNsTaR: 去玩玩看函數式語言 只有遞迴能用 XDD 08/20 23:29
→ CoNsTaR: 遞迴和迭代的適用時機不同啊 不能這樣比較 08/20 23:30
→ yyc1217: sort都有現成的可以用 幾乎沒寫過 08/20 23:38
推 Keade0325: 爬未知的組織樹層級資料還不錯 08/21 00:09
推 drm343: 看語言,多數語言不適合用遞迴的方式思考 08/21 00:15
推 typepeter: 實務上 函數式語言很常用的 08/21 00:20
推 typepeter: 遞迴難是因為終止及判斷式不容易 沒想清楚可能爆炸 08/21 00:22
推 dnabossking: 遞迴只該天上有,凡人該當用迴圈 08/21 00:31
→ kurakidream: 還真的沒用過函數式語言開發,受教了 @@ 08/21 00:57
→ descent: C程序设计的抽象思维,後半段都在教遞迴 08/21 01:00
推 jinmin88: 用遞迴很容易stack overflow吧 至少要用迴圈+stack解決 08/21 01:01
→ descent: 遞迴是值得投資的程式技巧 08/21 01:01
推 allqooxx: 推薦 SICP 這本書 XD 08/21 01:21
推 wuliou: 通常我可以用迴圈就不會用遞迴 就算自己懂後人難改啊 08/21 01:23
推 TTben: 實務上沒人用遞迴,認同+1 08/21 01:36
推 lastdreamer: 遞迴的可讀性比較高吧?? 08/21 02:12
推 lastdreamer: Recursion:Readability conciseness maintainability 08/21 02:22
→ lastdreamer: Iteration:Performance and avoid stack overflow 08/21 02:23
噓 jojoSpirit: 寫成迴圈可讀性很低是你能力的問題,不是迴圈的問題 08/21 02:25
→ Eleina: 老外說的是否有加分我不知道 我只知道離散數學裡的題幹很 08/21 02:35
→ Eleina: 容易理解 最終得出的遞迴關係乍看很難懂 08/21 02:35
推 lastdreamer: 實務上應用 Search Engine Crawler 08/21 03:47
推 lastdreamer: 或是 尋找所有D槽內的照片 08/21 04:01
推 lastdreamer: 或是 社群網路中列出兩個人的共同好友 08/21 04:04
推 TETZ: 寫久就有sense了我以前也覺得很苦手但工作久了就覺得還好 08/21 07:18
→ TETZ: 但我也只有非要遞迴不可時才用可以用迴圈就用迴圈 08/21 07:23
推 Sidney0503: 不要用遞迴 遞迴只是好看好讀 效能頂多跟迴圈一樣 08/21 08:14
→ bigpigbigpig: 以前都沒人告訴我遞迴很難,一不小心就學會了,拍謝 08/21 09:21
→ jimwayne123: 遞迴可讀性較高吧 +1... 08/21 09:43
→ xdraculax: 看東西,樹狀比較適合遞迴,遞迴程式比較短比較易讀 08/21 10:46
推 storyn26383: 有些東西用遞迴寫超簡單啊,例如樹的走訪 08/21 11:08
推 Beersheep: 等一下 好看好讀 效能也不差 那幹嘛還寫別的ww 08/21 11:16
→ Sidney0503: "頂多" 而且迴圈還有stack會滿的風險 08/21 11:36
→ Sidney0503: 而且那個頂多是能最佳化狀況 08/21 11:36
→ Sidney0503: 講錯 遞迴有會滿的風險 08/21 11:36
→ Sidney0503: 編譯器會最佳化迴圈 實際上效能是天差地遠 08/21 11:37
→ Sidney0503: 所以我說頂多跟迴圈一樣 唯一例外是tail recurrsion 08/21 11:38
→ Sidney0503: 除非你每個都寫成tail recurrsion 08/21 11:39
推 Ayukawayen: 看狀況 有些狀況真的遞迴比較適合 也沒必要都寫成迴圈 08/21 14:18
推 GlinX: 遞迴的確是比較好讀的 而且有時候迴圈內的邏輯要做成可於 08/21 14:31
→ GlinX: 子類別擴充時比較困難 就跟Stream API一樣一整坨在那裡 08/21 14:31
→ GlinX: 前面k大貼的連結的第二篇回文也說了 I love recursion 但 08/21 14:35
→ GlinX: 不適合用在沒有為遞迴tune過的程式語言上 例如Java 08/21 14:35
→ RapidGrowth: In order to understand recursion, one must first 08/21 16:53
→ RapidGrowth: understand recursion 08/21 16:53
→ RapidGrowth: 我想遞迴應該是開發起來很爽,寫完base cases就等於 08/21 17:06
→ RapidGrowth: 寫完整個程式了。開發速度快,成本低,效能之後再優 08/21 17:06
→ RapidGrowth: 化就好。 08/21 17:06
推 jackyu: 然後效能優化的最終版本就是寫成迴圈 08/21 17:34
推 aoc5000: 看一些ACM題目 強迫自己用遞迴寫 08/21 18:01
→ kiki86151: 我反而覺得遞迴比較好懂耶 可讀性高+1..表達又powerful 08/21 20:57
推 LaPass: 為什麼看推文會覺得遞迴好像很難的感覺..... 明明遞迴可以 08/21 22:11
→ LaPass: 很優雅的幹掉很多麻煩的問題啊.... 08/21 22:12
→ RapidGrowth: 我想大概是很多人根本不懂遞迴吧。我的話還被亂總結 08/21 22:34
推 konanno1: console.log((fac=(n,T)=>n==0?T:fac(n-1,n*T))(3,1)); 08/21 23:05
推 konanno1: 學遞迴順便學JavaScript好了,stack overfollow免驚。 08/21 23:17
推 alog: 因為很久以前有些前輩認為遞迴很危險 所以很多技術分享都會 08/22 01:48
→ alog: 講的很恐怖這樣 08/22 01:48
→ alog: 實際上說穿了就是對遞迴的掌握跟開發經驗不足所以才會有這 08/22 01:48
→ alog: 種奇怪的都市傳說冒出來 08/22 01:48
→ alog: 都快跟機房放乖乖的傳說差不多了 08/22 01:49
推 alog: 怕stack overflow 那測試跟抑制的部分要寫好 08/22 01:52
→ alog: 現實的狀況也沒那麼多時間讓你糾結要用迴圈還是遞迴 08/22 01:52
推 yenru: 有些程式不用遞回無法解啊… 08/22 08:14
→ feeya: 掃資料夾檔案的功能就可以用遞迴 08/22 11:31
推 jinmin88: 理論上所有recursive可以用loop+stack/queue替代 08/22 12:52
→ jinmin88: 更何況stack size會隨著你delopy的環境大小會有差 08/22 12:53
→ jinmin88: 這就是為什麼實作上鮮少有人用recursive的原因 08/22 12:55
→ recorriendo: tail recuesion 也是要 compiler 優化 08/23 02:41
→ recorriendo: 雖然那是滿基本的優化 但怎麼確定你的編譯器一定有 08/23 02:42
推 louner: leetcode上所有跟tree有關的題目都刷過一遍,你就會得了 08/24 19:36
→ louner: 不用遞迴就會死的病了 08/24 19:36
推 amazing2014: 在書上看到我覺得不錯的說法: 09/04 22:06
→ amazing2014: 參見『遞迴』,悟出道理後不再繼續 09/04 22:08
→ amazing2014: 定義是簡潔而嚴密 09/04 22:09