老师要我解释这个程序 ,还有堆栈的变化
你可以这样跟你老师解释这个阶乘递归的执行流程(包含递归工作栈的情况记录):
首先,当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; // 将本次递归得到的值返回给上一层调用的递归函数
}
第一层,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是一个求阶乘的函数,参数是长整型的,返回值也是长整型的,中间就是它的功能,利用递归来求阶乘。