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

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

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

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

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

请各位v2exer解惑,感谢!
16101 次点击
所在节点    程序员
81 条回复
plan9
2013-05-08 23:40:20 +08:00
@davepkxxx 记得某本书里写过:我的程序员要是用递归去计算阶乘,我宁愿换人。
nsa
2013-05-08 23:49:43 +08:00
@plan9 代码大全。。。
xavierskip
2013-05-08 23:55:57 +08:00
递归的规则很简单
1,需要调用本身
2,有个结束的条件


把一个大问题转化为同样的小问题,递归不就是就是不停的乘以比他大1的数吗。 n*f(n+1)

为了好判断终止条件,我们换成换成 n*f(n-1)

在函数内部设定个终止条件

def f(n):
____if n == 1:
________return 1

这个函数内部的n显然不再是外面带进去的那个n了,每个函数中都有一个不一样的n。

def f(n):
____if n == 1:
________return 1
____else:
________return n*f(n-1)

再了解递归可以去看看点稍微复杂点的例子,像二分法求平方根,快速排序。
nsa
2013-05-09 00:01:21 +08:00
孩子买书去学吧,推荐 莫绍揆的《递归论》
oyasmi
2013-05-09 00:07:50 +08:00
@liwei 嗯,同样推荐SICP,很强调递归的说,尤其习题要做一下。
lululau
2013-05-09 00:15:12 +08:00
@xatest 同意,我也觉得递归是对一个问题的更容易的解决方式,同样也是更没运行效率的一种解决方式
sectic
2013-05-09 00:21:26 +08:00
递归可以写阶乘,不慢。
迭代就是加了一个计数参数的尾递归。
递归有些时候不用就搞不出来。
sectic
2013-05-09 00:22:20 +08:00
吐个血槽,scheme 读输入都是拿递归
monkeylyf
2013-05-09 01:08:18 +08:00
写一点functional programming的东西 scala, haskell 不想递归也得递归
lldong
2013-05-09 01:30:22 +08:00
Ricepig
2013-05-09 05:06:46 +08:00
可以学学分形几何嘛,娃哈哈哈哈,自相似
csslayer
2013-05-09 05:11:29 +08:00
写 functional programming,把循环想成尾递归
davepkxxx
2013-05-09 09:19:40 +08:00
我记得我之前学习Scala,因为其不支持break而苦恼,结果Google Groups上的人推荐我用递归代替循环……
williamx
2013-05-09 09:25:53 +08:00
说明你是一个比较勤快的人---->当你变懒了之后,你就会想用递归等等----当然,优秀的程序员都是“懒”的。
fooCoder
2013-05-09 09:57:53 +08:00
@solesschong 什么是纯的程序员。。。
solesschong
2013-05-09 10:09:39 +08:00
@fooCoder 就是真正工作的时候很可能用不到。除非写很理论的东西
tyzc
2013-05-09 10:13:37 +08:00
@xatest 赞同。递归简单理解就是函数调用函数,不过调用的函数是自己而已。
fooCoder
2013-05-09 10:22:34 +08:00
@solesschong 也就是说你的意思是“纯的程序员”,就是搞理论的?
celadevra
2013-05-09 10:30:24 +08:00
可以跟一遍这个课程:https://class.coursera.org/proglang-2012-001/class/index
虽然只是个大三大四的课,其中大部分 SML 和 Racket 写的作业都要用到递归,做完一遍就差不多养成习惯了。
primer
2013-05-09 10:46:55 +08:00
这个我觉得主要靠练习,我刚开始接触递归的时候,也是像楼主一样搞不懂。 后来多想想,多练习,也发现没什么难的。
楼主可以从栈这方面理解,递归说白了就是不断的压栈呀,出栈...

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

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

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

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

© 2021 V2EX