C语言求阶乘,堆栈问题
答案:2 悬赏:10 手机版
解决时间 2021-04-06 05:27
- 提问者网友:做自己de王妃
- 2021-04-05 19:15
C语言求阶乘,堆栈问题
最佳答案
- 五星知识达人网友:蕴藏春秋
- 2021-04-05 20:52
举例,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是一个求阶乘的函数,参数是长整型的,返回值也是长整型的,中间就是它的功能,利用递归来求阶乘。
第一层,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是一个求阶乘的函数,参数是长整型的,返回值也是长整型的,中间就是它的功能,利用递归来求阶乘。
全部回答
- 1楼网友:詩光轨車
- 2021-04-05 22:15
你可以这样跟你老师解释这个阶乘递归的执行流程(包含递归工作栈的情况记录):
首先,当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; // 将本次递归得到的值返回给上一层调用的递归函数
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯