为什么我不习惯用递归,这方面我应该怎么加强?

2013-05-08 19:53:55 +08:00
 justfly
这个问题很苦恼。

比如说我想计算一个数的阶乘 n! 我首先想到的是用for循环一个一个的乘,根本想不到递归的方法。

当然这只是一个例子,当初学数据结构,二叉树遍历代码很简单,但因为是递归的,就觉得理解不透的感觉,汉诺塔那个递归算法也是记不住。太苦恼了

虽然所有递归理论来说都可以用普通方法代替,但是递归代码清晰易懂的优势也很大,所以请不要说难理解就别深究这样的话。

请各位v2exer解惑,感谢!
16101 次点击
所在节点    程序员
81 条回复
messense
2013-05-08 19:54:59 +08:00
人理解迭代,神理解递归。。。实在想不明白就这么安慰自己好了。
leiz
2013-05-08 20:02:43 +08:00
递归说白了就是数学归纳法
chemzqm
2013-05-08 20:06:15 +08:00
不用递归会对你写出好代码有多大影响?
darasion
2013-05-08 20:07:17 +08:00
@leiz 说的对。就当是用数学归纳法证明一道数学题。
holmesabc
2013-05-08 20:07:35 +08:00
其实把入与出的条件想清楚,就好理解了
iloahz
2013-05-08 20:15:25 +08:00
我觉得自己跟着递归的程序跑一跑挺好的,就是在大脑里一条一条的执行语句,比如hanoi
Cadina
2013-05-08 20:28:33 +08:00
不要尝试理解递归,理解数学归纳法或循环不变式
YUCOAT
2013-05-08 20:33:41 +08:00
最近我在研究红黑树,感觉红黑树实现起来好复杂。。
后来想想其实不算复杂,之所以觉的复杂,无非是因为自己没有理解透。所以啊,想办法先理解透了再说吧。
detailyang
2013-05-08 20:43:53 +08:00
要理解递归,首先要理解递归 = =,我也被搞死,二叉树,深度优先 = =
solesschong
2013-05-08 20:44:50 +08:00
做纯程序员才用到递归。实在不喜欢递归可以去做前台,做应用。
Golevka
2013-05-08 20:58:10 +08:00
Go functional yourself, Webvolutionaries!
wodemyworld
2013-05-08 21:02:51 +08:00
盗梦空间就是个递归系统,最后很可能回到现实了还return呢,或者在某一层梦境中丢了陀螺,结果出不来了
如果不是十分自信,就别用递归了,耗栈区资源,切换上下文频繁,也没多大收益,现在基本没人用专门的递归机器(硬件)了,所以能转换成for循环的就别用这货了。。。。
alexrezit
2013-05-08 21:09:26 +08:00
我觉得递归理解起来更简单啊.
用循环总是搞错次数, 用递归就从来不会.
liwei
2013-05-08 21:09:52 +08:00
xatest
2013-05-08 21:27:43 +08:00
从机器执行程序的角度来说迭代的效率肯定高于递归,因为递归在执行时需要函数嵌套好多层,对函数栈的消耗相当大,看上去就如同一段缩进了很多层的代码。所以LZ能优先用迭代而不是递归的话,反而是一个优势啊,我往往就想不到,LZ没什么好苦恼的。
但是从人理解的容易程度上讲,递归更容易理解吧。试想一个典型的递归结构,就是文件系统里的目录,每个目录里可能还有目录。如果要写一个函数,列出文件系统上所有目录和文件,最容易想到的算法是什么?首先写一个函数,列出当前层的所有目录和文件(类似ls命令),如果列出的是目录,再调用自身,不就解决了。
glume
2013-05-08 21:35:15 +08:00
碰见类似的问题。曾写帖子“回复”代码,一层回复一层,如果不停的回复前面的回复,嵌套起来压力很大。
youlil
2013-05-08 22:41:44 +08:00
@leiz 递归和数学归纳法是正反的区别
swulling
2013-05-08 22:45:41 +08:00
生产环境老板要写个阶乘,谁要写个递归版本的,直接被开掉
Golevka
2013-05-08 23:12:26 +08:00
@swulling
sub factorial {
reduce {$a * $b} 1, 1 .. $_[0];
}
ML与Haskell里也有fold类似物, 但是fold也是递归定义的.
davepkxxx
2013-05-08 23:33:56 +08:00
递归我能不用就不用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/68190

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX