内容正文:
章 节
第9章 函数(二)
目 标
1、掌握函数的嵌套调用和递归调用
2、掌握递归程序的编写
3、编译预处理的含义和宏定义、文件包含、条件编译指令的使用
主要内容
1、函数的嵌套调用;
2、函数的递归调用;
3、递归程序的编写;
4、编译预处理的含义;
5、宏定义、文件包含、条件编译指令的使用。
重 点
难 点
1、递归的概念
2、递归程序的编写
3、宏定义的使用
教授思路,采用的教学方法和辅助手段,板书设计,重点如何突出,难点如何解决,师生互动等
主要思路:
用图示的方法说明递归的概念,说明递归程序的作用、应用、限制;并通过程序示例的方式说明递归程序的编写方法。
在预处理指令中,重点是宏定义的使用;并通过示例演示说明具体的使用方法。
一、函数的嵌套
1、概述
C语言程序是由函数组成的,每一个函数相互独立,没有从属关系,一个函数即可以调用其它函数,也可以被其他函数调用。函数之间通过这种调用和被调用相关联,形成了函数的嵌套调用。C语言对函数嵌套调用的深度原则上没有限制,只与具体的系统有关。
2、函数嵌套调用程序示例
二、函数的递归调用
1、概述
在函数调用中,一般是一个函数调用另一个函数,如果一个函数在其执行过程中又调用了自己,则称为函数的递归调用。函数的递归调用分为直接递归和间接递归两种形式,直接递归就是在函数内部直接调用自己;间接递归是函数通过其他函数间接地调用自己。
2、递归程序示例
(1)用递归法求n!
(2)求Fibanacci数列的前10项
3、编写递归函数的注意事项
(1)参数传递
一个函数通常含有若干个形式参数,在函数内部要实现递归调用,就必须正确地构造出和函数形式参数个数相等且类型兼容的实际参数。
(2)递归结束条件
由于递归是自己调用自己,因此递归调用必须有一个结束条件,否则递归调用将无休止地继续下去。一般的做法是在函数递归调用语句的前面,使用if语句强迫函数在未执行递归时返回
四、编程举例
1、验证哥德巴赫猜想
· 编程思路:将输入的偶数分解为:n=i+j,其中i和j都是奇数。检测i和j是否同时为素数,如果是,则显示输出;否则,继续检测下一个分解。
2、汉诺塔问题
· 编程思路
将n个盘子从A座移动到C座可以分解为下列3个步骤:
(1)将A座上的n-1个盘子,借助C座,移动到B座。
(2)将A座上剩下的一个盘子移动到C座。
(3)将n-1个盘子从B座,借助A座,移动到C座。
在上面的3个步骤中,第1步和第3步完成的功能都是把多个盘子从一个座移动到另一个座,这是一个递归过程,可以用一个递归函数实现;第2步是将一个盘子从一个座移动到另一个,可以用一个普通函数实现。
3、求最大公约数
· 编程思路:两个数x和y的最大公约数可以写成下列递归式,因此可以定义一个用于求出数对(x,y)最大公约数的递归函数;然后循环求出所有两个数的最大公约数,并显示最大公约数是1的数对。
gcd(x,y)=
x 当y=0时
gcd(y,x%y) 当y≠0时
学科网(北京)股份有限公司
函数的嵌套调用图示
⑨
⑧
⑦
⑤
③
②
①
函数fun2
main函数
调用fun1函数
结束
函数fun1
调用fun2函数
④
⑥
两种递归形式示意图
(b) 间接递归
函数ofunc
函数func
(a) 直接递归
函数func
$$