C语言程序设计S8递归函数 公开课
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
x*fac(x-1) 当x!=1
printf("%d!=%d\n",n,sum); }
int fac(int x) {
边界条件
fac(x)= 1
当x>1
int s;
if (x==1)
/*判断x是否等于1*/
s=1;
/*如果x等于1,那么问题可以解决,解是s=1*/
else s=x*fac(x-1); /*如果不等于1,则问题仍较大,需进一步分解;*/
return s;
}
实参传递 参数值为 n=4
由上一轮调用传递实 由上一轮调用传递实 由上一轮调用传递实
参值为x-1=3
参值为x-1=2
参值为x-1=1
此时执行:fac(4) 此时执行:fac(3)
借助fac(3)的 返回值,求取了
最终结果,为 4×6=24
借助fac(2)的返回值,求 取fac(3)函数值,为
3×2=6,将该值返回给 fac(3)的调用处。
此时执行:fac(2)
借助fac(1)的返回值,求 取fac(2)函数值,为
2×1=2,将该值返回给 fac(3)的调用处。
此时执行:fac(1),
问题可解,s=1,产 生第一个返回值,返 回给函数f(2)的调用 处
在结束fac(4)函数后,将最终的fac(4)函数值作为返回值,传递给主函数中的调用处。
求n!可以用递归方法: 例如: 4!等于3!×4; 而3!=2!×3; 2!=2×1!; 1!=1 可用下面的递归公式表示:
n!=1
n·(n-1)!
(n=0,1) (n>1)
int main()
{
int fac(int); /*对fac函数的声明*/
int sum;
函数fac的作用:
sum=fac(4); /*调用fac函数,求4!*/
注意: 递归调用无法自行结束,需要一定的控制条件来结束递 归调用,否则形成死循环。这一条件称为边界条件。
递推过程
原问题
子问题
可解问题
原问题 庞大复杂 难以求解
与原问题相比 性质相同 规模缩小
问题难度降低
最终获得 能够解决的 可解问题
回归过程
原问题解
子问题解
原问题
子问题
解
有解问题
例 用递归方法求n!
总结:
1. 转化、分解原问题:形成性质相同,规模缩小的 子问题。(递推过程)
2. 对子问题的求解,得到可解问题的解,再反推回 去。(回归过程)
思考题:
台阶问题:一个楼梯共有N阶台阶,每次可以上一阶 或两阶,问上该楼梯一共有多少种不同的方法?
在调用一个函数的过程中又出现直接或间接地调用该函数本 身,称为函数的递归调用。 递归函数的执行过程本质上是一种特殊的函数嵌套调用。 C语言允许函数的递归调用。例如:§2. 函数的递归调用
int f(int x)
{ int y,z; ... z=f(y);
... return(2*z); }
程序执行过程: f函数开始 调用f函数 f函数结束
微课《计算机程序设计基础》
主讲:xx 讲师 环境与规划学院
§1.重点回顾
函数的嵌套调用: 在调用一个函数的过程中,又调用另一个函数。
主函数
子函数
函数能否在调用的过程中调用自身?
§2. 函数的递归调用
许多函数在数学中的定义就是用递归形式定义的。 比如:
n! =n*(n-1)! Xn=X* Xn-1