[討論] 遞迴要如何鍛鍊

看板Soft_Job作者 (perry tsai)時間7年前 (2016/08/20 19:34), 編輯推噓42(43160)
留言104則, 52人參與, 最新討論串1/4 (看更多)
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

08/20 19:42, , 1F
Then I think you should be a human.
08/20 19:42, 1F

08/20 19:44, , 2F
想練遞迴,可用LISP語言
08/20 19:44, 2F

08/20 19:44, , 3F
實務上沒人在用遞迴
08/20 19:44, 3F

08/20 19:45, , 4F
不過拿來練習思考是不錯的
08/20 19:45, 4F

08/20 19:56, , 5F
遞迴就像金門沙堆中的炸彈 炸死無辜接手的後人
08/20 19:56, 5F

08/20 19:58, , 6F
遞迴很基本好嘛 有些程式叫我改寫成迴圈版本我還要想一下
08/20 19:58, 6F

08/20 20:00, , 7F
之前再看Functional programming in scala
08/20 20:00, 7F

08/20 20:01, , 8F
就是強制要你練習不要用迴圈 習慣了就好
08/20 20:01, 8F

08/20 20:04, , 9F
還有goto可以用
08/20 20:04, 9F

08/20 20:12, , 10F
沒人用? findcontrol表示
08/20 20:12, 10F

08/20 20:25, , 11F
寫題目 例如leet code 試著用遞迴去解
08/20 20:25, 11F

08/20 20:45, , 12F
確定深度不會太深的時候遞迴很好用啊
08/20 20:45, 12F

08/20 21:03, , 13F
畢業許久,我到河內塔還是搞不懂…
08/20 21:03, 13F

08/20 21:06, , 14F
哪裡沒人用? 只是你剛好用不到吧
08/20 21:06, 14F

08/20 21:14, , 15F
若call stack不深,且能增加可讀性是不錯的
08/20 21:14, 15F

08/20 21:14, , 16F
可以參考這篇http://goo.gl/xLcghQ
08/20 21:14, 16F

08/20 21:31, , 17F
的確很久沒用過遞迴了 迴圈的可讀性比較高
08/20 21:31, 17F

08/20 21:43, , 18F
寫個 merge 跟 quick sort 迴圈版來看看就好,寫死你..
08/20 21:43, 18F

08/20 21:44, , 19F
開發速度的差別。
08/20 21:44, 19F

08/20 21:45, , 20F
費式數的遞迴都寫不出來,那演算法,計算理論都 bye 了.
08/20 21:45, 20F

08/20 21:46, , 21F
簡單的遞迴並不難學會,方法如下:
08/20 21:46, 21F

08/20 21:54, , 22F
08/20 21:54, 22F

08/20 21:56, , 23F
08/20 21:56, 23F

08/20 21:59, , 24F
f(a){if(a == 0) return else f(--a)}
08/20 21:59, 24F

08/20 22:04, , 25F
嫩嫩我迴圈,大大你遞迴
08/20 22:04, 25F

08/20 23:21, , 26F
不要用遞迴+1
08/20 23:21, 26F

08/20 23:29, , 27F
去玩玩看函數式語言 只有遞迴能用 XDD
08/20 23:29, 27F

08/20 23:30, , 28F
遞迴和迭代的適用時機不同啊 不能這樣比較
08/20 23:30, 28F

08/20 23:38, , 29F
sort都有現成的可以用 幾乎沒寫過
08/20 23:38, 29F

08/21 00:09, , 30F
爬未知的組織樹層級資料還不錯
08/21 00:09, 30F

08/21 00:15, , 31F
看語言,多數語言不適合用遞迴的方式思考
08/21 00:15, 31F

08/21 00:20, , 32F
實務上 函數式語言很常用的
08/21 00:20, 32F

08/21 00:22, , 33F
遞迴難是因為終止及判斷式不容易 沒想清楚可能爆炸
08/21 00:22, 33F

08/21 00:31, , 34F
遞迴只該天上有,凡人該當用迴圈
08/21 00:31, 34F

08/21 00:57, , 35F
還真的沒用過函數式語言開發,受教了 @@
08/21 00:57, 35F

08/21 01:00, , 36F
C程序设计的抽象思维,後半段都在教遞迴
08/21 01:00, 36F

08/21 01:01, , 37F
用遞迴很容易stack overflow吧 至少要用迴圈+stack解決
08/21 01:01, 37F

08/21 01:01, , 38F
遞迴是值得投資的程式技巧
08/21 01:01, 38F

08/21 01:21, , 39F
推薦 SICP 這本書 XD
08/21 01:21, 39F
還有 25 則推文
08/21 11:37, , 65F
編譯器會最佳化迴圈 實際上效能是天差地遠
08/21 11:37, 65F

08/21 11:38, , 66F
所以我說頂多跟迴圈一樣 唯一例外是tail recurrsion
08/21 11:38, 66F

08/21 11:39, , 67F
除非你每個都寫成tail recurrsion
08/21 11:39, 67F

08/21 14:18, , 68F
看狀況 有些狀況真的遞迴比較適合 也沒必要都寫成迴圈
08/21 14:18, 68F

08/21 14:31, , 69F
遞迴的確是比較好讀的 而且有時候迴圈內的邏輯要做成可於
08/21 14:31, 69F

08/21 14:31, , 70F
子類別擴充時比較困難 就跟Stream API一樣一整坨在那裡
08/21 14:31, 70F

08/21 14:35, , 71F
前面k大貼的連結的第二篇回文也說了 I love recursion 但
08/21 14:35, 71F

08/21 14:35, , 72F
不適合用在沒有為遞迴tune過的程式語言上 例如Java
08/21 14:35, 72F

08/21 16:53, , 73F
In order to understand recursion, one must first
08/21 16:53, 73F

08/21 16:53, , 74F
understand recursion
08/21 16:53, 74F

08/21 17:06, , 75F
我想遞迴應該是開發起來很爽,寫完base cases就等於
08/21 17:06, 75F

08/21 17:06, , 76F
寫完整個程式了。開發速度快,成本低,效能之後再優
08/21 17:06, 76F

08/21 17:06, , 77F
化就好。
08/21 17:06, 77F

08/21 17:34, , 78F
然後效能優化的最終版本就是寫成迴圈
08/21 17:34, 78F

08/21 18:01, , 79F
看一些ACM題目 強迫自己用遞迴寫
08/21 18:01, 79F

08/21 20:57, , 80F
我反而覺得遞迴比較好懂耶 可讀性高+1..表達又powerful
08/21 20:57, 80F

08/21 22:11, , 81F
為什麼看推文會覺得遞迴好像很難的感覺..... 明明遞迴可以
08/21 22:11, 81F

08/21 22:12, , 82F
很優雅的幹掉很多麻煩的問題啊....
08/21 22:12, 82F

08/21 22:34, , 83F
我想大概是很多人根本不懂遞迴吧。我的話還被亂總結
08/21 22:34, 83F

08/21 23:05, , 84F
console.log((fac=(n,T)=>n==0?T:fac(n-1,n*T))(3,1));
08/21 23:05, 84F

08/21 23:17, , 85F
學遞迴順便學JavaScript好了,stack overfollow免驚。
08/21 23:17, 85F

08/22 01:48, , 86F
因為很久以前有些前輩認為遞迴很危險 所以很多技術分享都會
08/22 01:48, 86F

08/22 01:48, , 87F
講的很恐怖這樣
08/22 01:48, 87F

08/22 01:48, , 88F
實際上說穿了就是對遞迴的掌握跟開發經驗不足所以才會有這
08/22 01:48, 88F

08/22 01:48, , 89F
種奇怪的都市傳說冒出來
08/22 01:48, 89F

08/22 01:49, , 90F
都快跟機房放乖乖的傳說差不多了
08/22 01:49, 90F

08/22 01:52, , 91F
怕stack overflow 那測試跟抑制的部分要寫好
08/22 01:52, 91F

08/22 01:52, , 92F
現實的狀況也沒那麼多時間讓你糾結要用迴圈還是遞迴
08/22 01:52, 92F

08/22 08:14, , 93F
有些程式不用遞回無法解啊…
08/22 08:14, 93F

08/22 11:31, , 94F
掃資料夾檔案的功能就可以用遞迴
08/22 11:31, 94F

08/22 12:52, , 95F
理論上所有recursive可以用loop+stack/queue替代
08/22 12:52, 95F

08/22 12:53, , 96F
更何況stack size會隨著你delopy的環境大小會有差
08/22 12:53, 96F

08/22 12:55, , 97F
這就是為什麼實作上鮮少有人用recursive的原因
08/22 12:55, 97F

08/23 02:41, , 98F
tail recuesion 也是要 compiler 優化
08/23 02:41, 98F

08/23 02:42, , 99F
雖然那是滿基本的優化 但怎麼確定你的編譯器一定有
08/23 02:42, 99F

08/24 19:36, , 100F
leetcode上所有跟tree有關的題目都刷過一遍,你就會得了
08/24 19:36, 100F

08/24 19:36, , 101F
不用遞迴就會死的病了
08/24 19:36, 101F

09/04 22:06, , 102F
在書上看到我覺得不錯的說法:
09/04 22:06, 102F

09/04 22:08, , 103F
參見『遞迴』,悟出道理後不再繼續
09/04 22:08, 103F

09/04 22:09, , 104F
定義是簡潔而嚴密
09/04 22:09, 104F
文章代碼(AID): #1Nk41F31 (Soft_Job)
文章代碼(AID): #1Nk41F31 (Soft_Job)