内容正文:
教案用纸
第 6 周 总第 18 次 学时:2
教学班级: 课程:C语言程序设计 授课教师:
课题:5.4 函数的嵌套调用 5.5 函数的递归调用
教学方法:多媒体演示、启发
教具:计算机
教学目标:使同学们巩固函数的调用及数据的传递
教学重点:函数的实际应用
教学难点:函数的递归调用
主要教学内容:
5.4 函数的嵌套调用
5.5 函数的递归调用
课后回顾:
教案用纸
导入:我们上节课学习了函数的定义和说明以及函数的数据传递,这节课我们通过上机巩固所学的函数知识。
正文:
5.4 函数的嵌套调用
C语言程序执行时都从main函数开始,在main 函数中遇到子函数调用语句,则调用该子函数,若有其他函数也可相互调用,但执行完子函数后最终必须返回主函数,直到程序结束。函数的嵌套调用是指在执行被调用函数时,被调用函数又调用了其他函数。
例如,在main函数中可以调用A函数,在调用A函数的过程中可以调用B函数;当B函数调用结束后返回到A函数,当A函数调用结束后,再返回到main函数,这就是函数的嵌套调用。其调用过程如图5-1所示。
图5-1 函数的嵌套调用过程示意图
在图5-1中,①,②,…,⑨,表示执行嵌套调用过程的序号。即从①开始,先执行main函数的函数体中的语句,当遇到调用A函数时,由②转去执行A函数;③是执行A函数的函数体中的语句,当遇到调用B函数时,由④转去执行B函数,⑤是执行B函数的函数体中的所有语句,当B函数调用结束后,通过⑥返回到调用B函数的A函数中;⑦是继续执行A函数体中的剩余语句,当A函数调用结束后,通过⑧返回到调用A函数的main函数中;⑨表示继续执行main函数的函数体中的剩余语句,结束本程序的执行。
函数嵌套调用时需要注意的以下两点。
(1)C语言程序中的函数定义都是平行、相互独立的。也就是说在一个函数定义的内部,不能定义其他函数,即函数的定义不允许嵌套。
(2)一个函数既可以被其他函数调用,也可以调用其他函数,这就是函数的嵌套调用。
5.5 函数的递归调用
函数通过其函数体中的语句直接或间接地调用自身,称为递归调用,这样的函数称为递归函数。
递归函数一般都有一个条件语句,执行语句分两部分,一个是结束递归的终值,一个是递归的返回表达式,表达式中有该函数的自身调用。
递归函数是无终止的调用自身。要避免这种情况的发生,使用递归解决的问题应满足两个基本条件:
(1)问题的转化。有些问题不能直接求解或难以求解,但它可以转化为一个新问题,这个新问题相对比原问题简单或更接近解决方法。这个新问题的解决与原问题一样,可以转化为下一个新问题,……。
(2)转化的终止条件。原问题到新问题的转化是有条件的,次数是有限的,不能无限次数地转化下去。这个终止条件也称为边界条件,相当于递推关系中的初始条件。
【案例5-4】设计递归函数fact(n),计算并返回n的阶乘值。
程序分析
一个整数n的阶乘可表示为:
1 (n=0或n=1)
n!=
1*2*…*n (n>1)
阶乘定义还可以表示为:
1 (n=0或n=1)
n!=
n*(n-1)! (n>1)
现在定义一个函数fact(n)来求n!时,可以使用如下的方式:
1 (n=0或n=1)
fact(n)=
n*fact(n-1) (n>1)
从上面可以看到,当n>1时,fact(n)可以转化为n*fact(n-1),而fact(n-1)与fact(n),只是函数参数由n变成n-1;而fact(n-1)又可以转化为(n-1)*fact(n-2),……,每次转化时,函数参数减1,直到函数参数的值为1时,1!的值为1,递归调用结束。
递归调用的过程如图5-2所示,假设输入n=5。
图5-2 fact函数的递归调用过程示意图
使用一个main函数调用fact求5!,如图5-2所示,倾斜箭头表示函数调用,旁边的数字表示传递的参数;下面的箭头表示函数返回,旁边的数字表示函数返回值。fact函数反复调用自身,fact(5)调用fact(4),fact(4)调用fact(3),fact(3)调用fact(2),……,参数逐次减小,当最后调用fact(1)时,结束调用,于是开始逐级完成乘法运算,最后计算出5!结果为120。
小结:
这节课我们主要通过练习题巩固了函数定义、调用以及函数的嵌套调用及递归调用,希望大家通过本节课的习题对函数能有进一步的理解。
备 注
难点:本题主要为函数的嵌套,通过本题主要弄清函数如何进行调用。
函递归调用在现实生活中的应用。
学科网(北京)股份有限公司
$$