| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1140 人关注过本帖
标题:不明白,要多问。
只看楼主 加入收藏
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:15 
factorial(4) == 4 * factorial(3)
                        |
                        +--> 3 * factorial(2)
                                     |
                                     +--> 2 * factorial(1)
                                                  |
                                                  +--> 1
执行的时候要一层一层的下来,直到 factorial(1) == 1,然后在一层一层的返回。
这个是不是比较好理解?
2011-08-02 18:43
编译中。。
Rank: 7Rank: 7Rank: 7
来 自:中国
等 级:黑侠
帖 子:198
专家分:511
注 册:2011-7-29
收藏
得分:0 
知道了 知道了。   不知道我理解的对不对。  表达起来太麻烦。   

我说一下。   第一次执行的时候   factorial(4)  然后执行  a *= factorial(a - 1)这个语句,这时 factorial(a - 1)的括号里的值就是3了  即factorial(3)  函数又被调用 。。。。。所以a的值直到最后才会被返回。

 当我感到些许疲倦时   便想躺在阳光下,小路旁 . 可这些往往都是奢望..
2011-08-02 18:47
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 32楼 编译中。。
正确
2011-08-02 18:48
编译中。。
Rank: 7Rank: 7Rank: 7
来 自:中国
等 级:黑侠
帖 子:198
专家分:511
注 册:2011-7-29
收藏
得分:0 
你这样一层一层的话   等全部 弄完之后  是这样的  4 * factorial(3)  3 * factorial(2) 2 * factorial(1)

等到全部执行完了之后 ,就变成这样了   a=4*3*2*1    这我理解了。


全都懂了。  真绕啊     这个 怎么样才能 一看就会呢? 感觉刚接触这个 太绕了吧。好难理解

 当我感到些许疲倦时   便想躺在阳光下,小路旁 . 可这些往往都是奢望..
2011-08-02 18:53
编译中。。
Rank: 7Rank: 7Rank: 7
来 自:中国
等 级:黑侠
帖 子:198
专家分:511
注 册:2011-7-29
收藏
得分:0 
不说了,给分。voidx 风生钧起   谢谢;了、

 当我感到些许疲倦时   便想躺在阳光下,小路旁 . 可这些往往都是奢望..
2011-08-02 18:53
编译中。。
Rank: 7Rank: 7Rank: 7
来 自:中国
等 级:黑侠
帖 子:198
专家分:511
注 册:2011-7-29
收藏
得分:0 
factorial(3): a!=1, 执行 a*=factorial(2) -> 调用factorial(2): a!=1(这个a与刚才的不是同一个,它们是不同函数里的), 执行 a*=factorial(1) -> 调用factorial(1): a==1, 返回1给调用它的factorial(2)函数,factorial(1)函数结束 -> 回到factorial(2): a的值已经算完(=2),执行下一句:返回a的值即2给调用它的函数factorial(3), factorial(2)函数结束 -> 回到factorial(3): a的值已经算完(=6),执行下一句:返回a的值即6。.
执行结果为factorial(3)=6。
递归就是不停地调用自身。这里要注意即使是同一个函数,他被多次调用时参数名虽然一样但并不是完全等同的   


这是最完整的答案,完美的说明了 return 1; 和return a;   和为何循环的原因。

[ 本帖最后由 编译中。。 于 2011-8-2 18:58 编辑 ]

 当我感到些许疲倦时   便想躺在阳光下,小路旁 . 可这些往往都是奢望..
2011-08-02 18:56
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
这个不叫做循环~跟循环有区别,他叫做递归。先把这个记住吧,其他的慢慢理解

还有 0! == 1

[ 本帖最后由 voidx 于 2011-8-2 19:03 编辑 ]
2011-08-02 19:01
编译中。。
Rank: 7Rank: 7Rank: 7
来 自:中国
等 级:黑侠
帖 子:198
专家分:511
注 册:2011-7-29
收藏
得分:0 
voidx  你让我理解了这个  风生钧起你让我思考了这个。 而上面的答案是百度上的···  最完整的 往下和返回。  原来 可以是函数可以当做不同的来使用。 哈哈哈      哈哈  能懂真是太高兴了。

我这样的新手。只学过 printf  scanf  和 运算符  if  语句   和函数定义(没学完)   真的好不容易。

不知道以后能不能一眼看破

 当我感到些许疲倦时   便想躺在阳光下,小路旁 . 可这些往往都是奢望..
2011-08-02 19:03
编译中。。
Rank: 7Rank: 7Rank: 7
来 自:中国
等 级:黑侠
帖 子:198
专家分:511
注 册:2011-7-29
收藏
得分:0 
以下是引用voidx在2011-8-2 19:01:44的发言:

这个不叫做循环~跟循环有区别,他叫做递归。先把这个记住吧,其他的慢慢理解



呵呵呵。记住了  调用自身叫做递归。  呵呵。

 当我感到些许疲倦时   便想躺在阳光下,小路旁 . 可这些往往都是奢望..
2011-08-02 19:04
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
这么基础的东西,还是建议楼主去找点书看看。
如果你说这个书上是一笔带过的,那么要不就是书后面会专门再回来讲,要么就是这书讲的太浅了。

如果想知道流程是怎么执行的,可以再代码里加点 printf 语句。当然你如果会的话,跟踪一下也可以。

不过阶乘这种递归的形式,是最简单直接的递归思想。我确实不觉得会有书说不清楚。楼主再仔细看看书,没准能悟出更多东西。
2011-08-02 20:05
快速回复:不明白,要多问。
数据加载中...
 
   



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

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