[爆卦]遞迴題目練習是什麼?優點缺點精華區懶人包

為什麼這篇遞迴題目練習鄉民發文收入到精華區:因為在遞迴題目練習這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者ripple0129 (perry tsai)看板Soft_Job標題[討論] 遞迴要如何鍛鍊時...



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
kurakidream: 可以參考這篇http://goo.gl/xLcghQ 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
lastdreamer: http://stackoverflow.com/a/72694 08/21 02:26
Eleina: 老外說的是否有加分我不知道 我只知道離散數學裡的題幹很 08/21 02:35
Eleina: 容易理解 最終得出的遞迴關係乍看很難懂 08/21 02:35
lastdreamer: http://tinyurl.com/juep8te 08/21 03:06
lastdreamer: 實務上應用 Search Engine Crawler 08/21 03:47
lastdreamer: https://tour.golang.org/concurrency/10 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

你可能也想看看

搜尋相關網站