C语言求阶乘,堆栈问题

老师要我解释这个程序 ,还有堆栈的变化

 你可以这样跟你老师解释这个阶乘递归的执行流程(包含递归工作栈的情况记录):

首先,当n不为,则进入递归,并且当前递归函数所有有关的值也进栈,反复如此进栈,直到n等于0,这一阶段称为递归试探阶段。

然后,当n等于0时,则出栈了,由栈顶往栈底方向出栈。这一阶段称为递推阶段。


你还可以现场示范给你老师看,把工作栈的进入和出栈的记录情况写在黑板上。


如:设n=5,则递归工作栈如下所示:

1、第一阶段:试探


    y=1*fact(0) <===栈顶

    y=2*fact(1) 

    y=3*fact(2) 

    y=4*fact(3) 

    y=5*fact(4) <===栈底


2、第二阶段:递推

    因为n等于0时,则y=1返回1 即fact(1)返回1

    

   第一次出栈情况:

    y=1*fact(0)  <===由栈顶开始陆续出栈 y=1*1=1 把fact(0)=1的结果返回给调用处即下一个栈

    y=2*fact(1) 

    y=3*fact(2) 

    y=4*fact(3) 

    y=5*fact(4) 


   第二次出栈情况:

    y=2*fact(1)  <===由栈顶开始陆续出栈 y=2*1=2

    y=3*fact(2) 

    y=4*fact(3) 

    y=5*fact(4) 


   第三次出栈情况:

    y=3*fact(2) <===由栈顶开始陆续出栈 y=3*2=6

    y=4*fact(3) 

    y=5*fact(4) 


   第四次出栈情况:

    y=4*fact(3) <===由栈顶开始陆续出栈 y=4*6=24

    y=5*fact(4) 


  第五次出栈情况:

    y=5*fact(4)  <===由栈顶开始陆续出栈 y=5*24=120


   至此,栈底为NULL,把控制权返回给调用函数处(这里即main函数)

   打印输出 k=120


我想这种回答肯定能令你老师满意。老师一看就是知道你是非常熟悉栈的运行原理。

long fact(long n){
long y;

if (n == 0) y = 1;  // 递归出口条件,如果n等于0,则y=1
else y = n*fact(n - 1); // 递归调用

return y;  // 将本次递归得到的值返回给上一层调用的递归函数
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-10-28
举例,10的阶乘,先下楼后上楼
第一层,10的阶乘fact(10),不满足结束条件,进入下一层,10*fact(9).
第二层,9的阶乘fact(9),不满足结束条件,进入下一层,9*fact(8)
...
第10层,1的阶乘fact(1),不满足结束条件,进入下一层,1*fact(0)
第11层,0的阶乘,满足结束条件,fact(0)=1,可以上楼了。
第10层,1的阶乘为1*fact(0)=1
第9层,2的阶乘为2*fact(1)=2
。。。
第1层,10*fact(9)=。。。

这些层就是堆栈,一层层下去,满足递归条件后再一层层上来。完成递归。追问

能解释下每句代码的意思吗? 我实在是不懂,老师要我们讲这道题作为考试

追答

有两个大括号,一个是main,这是主函数,是程序的入口
1)声明了两个长整型的变量x,k。
2)读取x的值
3)调用fact函数,并将返回值赋值给k
4)输出k的值

fact是一个求阶乘的函数,参数是长整型的,返回值也是长整型的,中间就是它的功能,利用递归来求阶乘。

本回答被网友采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网