[讨论] 递回要如何锻炼

楼主: 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