| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1400 人关注过本帖
标题:[求助] 递归函数不太明白
只看楼主 加入收藏
非常后街
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-6-16
收藏
 问题点数:0 回复次数:18 
[求助] 递归函数不太明白

我是 初学者, 对递归函数不太明白, 那位高手能不能具体介绍下 递归函数具体怎么套用自己的具体过程. 谢了 .






搜索更多相关主题的帖子: 递归 函数 
2007-06-17 15:54
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
收藏
得分:0 

递归就是"自己调用自己".
形如:
int func(int a){
a=func(a);
return a;
}
在递归中必须有结果递归的条件, 以及达成这个条件的语句.
阶乘应该算最经典的递归了.
N! = 1 * 2 * ... * N
你试着做下

[此贴子已经被作者于2007-6-17 16:58:36编辑过]


女侠,约吗?
2007-06-17 16:40
ioriliao
Rank: 7Rank: 7Rank: 7
来 自:广东
等 级:贵宾
威 望:32
帖 子:2829
专家分:647
注 册:2006-11-30
收藏
得分:0 
我记得C++程序设计那本书有一句名言是这样的:
递归的是神,矢代的是人


/images/2011/147787/2011051411021524.jpg" border="0" />
2007-06-17 16:43
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
收藏
得分:0 
递归在stack很小的环境下发挥不了作用, 而且速度不够快.. 迭代可以做到相当快的速度..
所以一般数据量大的时候多用后者..

女侠,约吗?
2007-06-17 16:57
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
说实话:阶乘那个用递归真是……完全没必要,仅仅当个例子还差不多!

可以的话,尽量用迭代吧!

Fight  to win  or  die...
2007-06-17 17:22
非常后街
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-6-16
收藏
得分:0 
谢谢 诸位``` 还有很多要学习,努力

2007-06-17 17:26
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
收藏
得分:0 
呀..才发现, 脑子进水了.. 我写阶乘干P啊... 阶乘又用不着递归...一个for就够了 - -|||
多谢aipb2007兄提醒.

本来是想写费氏数列来着...不好意思..

Fibonacci数列
1、1、2、3、5、8、13、21、34、55、89、144...

从第3个数开始, 每个数是它前面两个数之和...
这个才是经典递归算法..
也可以用迭代方式完成...

汉诺塔(Hanoi)..就是文曲星经典游戏之一, 是只能用递归完成的... 你可以试试..

女侠,约吗?
2007-06-17 18:02
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
以下是引用野比在2007-6-17 18:02:54的发言:
呀..才发现, 脑子进水了.. 我写阶乘干P啊... 阶乘又用不着递归...一个for就够了 - -|||
多谢aipb2007兄提醒.

本来是想写费氏数列来着...不好意思..

Fibonacci数列
1、1、2、3、5、8、13、21、34、55、89、144...

从第3个数开始, 每个数是它前面两个数之和...
这个才是经典递归算法..
也可以用迭代方式完成...

汉诺塔(Hanoi)..就是文曲星经典游戏之一, 是只能用递归完成的... 你可以试试..

真不好意思,我又要反驳你了!
如果你说fib数列是经典递归,那完全错了,那是个失败的不恩能够再失败的递归。
你画个递归树就发现,那个增长完全是比几何还几何的。

所以fib数列最好的仍然是迭代!hanoi tower我同意。但是并不是只能用递归。
所有的的递归和迭代都可以相互转换。
但是有的递归转换为迭代要用到栈存贮数据,这样效率等同于直接用递归了。


呵呵,欢迎探讨哈!


Fight  to win  or  die...
2007-06-17 18:14
野比
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:24
帖 子:1627
专家分:516
注 册:2007-5-24
收藏
得分:0 
接受反驳..另外解释一下我的话.
fib用迭代效率较高并不能否定它经典递归范例的地位.
f(n)=f(n-1)+f(n-2) (n>2) 绝对是用递归完成的优秀例子. (并不是说用递归就效率高了)
说句实话.. fib数列其实同时也是迭代的经典例子.. 它的递归定义是"为了递归而递归"的...
至于Hanoi.. 确实也有所谓"非递归算法", 说白了并不是思路上有所不同, 只能算是"人"多做了一些"机器"的工作...
比如人工判断第一个盘子如何移动等...

递归并非算法, 只能说是一种"思想", 诚然所有递归都可以用迭代的方式解决,
但决不能因很多问题递归效率不高而否定它优秀编程思想的地位而加以排斥.
递归体现了一种"自顶向下"的思想, 迭代则可以算"自底向上"..
人家戏称递归是"唯美主义"者的最爱, 迭代则是"效率至上论"的利剑...

多谢指教! (^^!)
还有反驳请继续...

女侠,约吗?
2007-06-17 18:58
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
回复:(野比)接受反驳..另外解释一下我的话.fib用迭...
呵呵~

递归确实如你所说,是一种思想。并且是很有魔力的。老实说,我非常喜欢递归。
递归处理很多问题时,可以很直接,很简单。有时说迭代是人的自然思维,但是我觉得递归才是,很多问题我很容易就想到递归,但是用迭代就很困难,无论思维上还是代码上。

我也不排斥递归,但是递归思想广泛用于实际问题和算法,提到这个,就不得不考虑效率。所以就出现了一个选择:究竟是递归还是迭代?

比如fibnacci数列,其实很容易想到递归,但是代码写出来了,再头脑里运行一下:
计算f5吧:
f5
f3 f4
f1 f2 f2 f3
……………………………………
这就是递归树一部分,发现了:总有f(n)在重复计算,兰色的f3能用红色的f3吗?no,不行,寄存器不会为你保留。
光递归压栈这个众所周知的降低时间效率不说,这样的重复也大大降低了空间效率。
所以我认为fib的递归解实在只能是个反面教材。
在实际运用中,前几天有个数60头牛的帖子,就用fib数列为基础设计算法。产生了两个版本,一个递归,一个迭代,肯定迭代版更优秀吧!

递归是个好东东,把递归剖开就是 “栈”,这个看似简单的东西作用太大了。要深刻的了解递归一定要搞清楚它的本质。

我也是在学习中。

Fight  to win  or  die...
2007-06-17 20:06
快速回复:[求助] 递归函数不太明白
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036401 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved