| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1140 人关注过本帖
标题:不明白,要多问。
取消只看楼主 加入收藏
编译中。。
Rank: 7Rank: 7Rank: 7
来 自:中国
等 级:黑侠
帖 子:198
专家分:511
注 册:2011-7-29
收藏
得分:0 
听不懂。。。。。,饿    自己能弄明白就不来问了

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

函数调用堆栈是这样的:
 
fatorial(4)
    factorial(3)
        factorial(2)
            factorial(1)
            return a        // from factorial(1), 1
        return a            // from factorial(2), 2
    return a                // from factorial(3), 6
return a                    // from factorial(4), 24
 
清楚么?
能详细点不,  ()里的值 因为什么 而 一直递减,详细点

 当我感到些许疲倦时   便想躺在阳光下,小路旁 . 可这些往往都是奢望..
2011-08-02 18:23
编译中。。
Rank: 7Rank: 7Rank: 7
来 自:中国
等 级:黑侠
帖 子:198
专家分:511
注 册:2011-7-29
收藏
得分:0 
回复 26楼 voidx
a *= factorial(a - 1) 时,   这里的时候  a不是等于 a *= factorial(a - 1)  那a应该是3*4==12  而下一次为什么又成了 3-1??

 当我感到些许疲倦时   便想躺在阳光下,小路旁 . 可这些往往都是奢望..
2011-08-02 18:31
编译中。。
Rank: 7Rank: 7Rank: 7
来 自:中国
等 级:黑侠
帖 子:198
专家分:511
注 册:2011-7-29
收藏
得分:0 
奥。我好像有点动了。   我 先 整理一下

调用 factorial(3)  时 a *= factorial(a - 1)  执行了吗?

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

 当我感到些许疲倦时   便想躺在阳光下,小路旁 . 可这些往往都是奢望..
2011-08-02 18:32
编译中。。
Rank: 7Rank: 7Rank: 7
来 自:中国
等 级:黑侠
帖 子:198
专家分:511
注 册:2011-7-29
收藏
得分:0 
a与刚才的不是同一个?  因为执行了 a *= factorial(a - 1) 之后 a的值不就变大了?  a=4*factorial(4-1); 不是吗。a就变成了 12 了  为什么下次还会是 3-1==2 呢。  a 难道 是不同的?

 当我感到些许疲倦时   便想躺在阳光下,小路旁 . 可这些往往都是奢望..
2011-08-02 18:42
编译中。。
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
编译中。。
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
编译中。。
Rank: 7Rank: 7Rank: 7
来 自:中国
等 级:黑侠
帖 子:198
专家分:511
注 册:2011-7-29
收藏
得分:0 
voidx  你让我理解了这个  风生钧起你让我思考了这个。 而上面的答案是百度上的···  最完整的 往下和返回。  原来 可以是函数可以当做不同的来使用。 哈哈哈      哈哈  能懂真是太高兴了。

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

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

 当我感到些许疲倦时   便想躺在阳光下,小路旁 . 可这些往往都是奢望..
2011-08-02 19:03
快速回复:不明白,要多问。
数据加载中...
 
   



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

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