[討論] 遞迴要如何鍛鍊

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

Links booklink

Contact Us: admin [ a t ] ucptt.com