06-函数嵌套调用与递归调用课件
- 格式:pdf
- 大小:1.01 MB
- 文档页数:14
函数嵌套与递归调用的区别
函数嵌套是语言特性,递归调用是逻辑思想。
1 函数嵌套
函数嵌套允许在一个函数中调用另外一个函数,比如有三个函数
例:
funca()
{
funcb();
}
funcb()
{
funcc();
}
funcc()
{
cout << "Hello" <<endl;
}
这个就叫做嵌套调用,它是一个语言提供的程序设计的方法,也就是语言的特性。
2 递归调用
而递归是一种解决方案,一种思想,将一个大工作分为逐渐减小的小工作,比如说一个和尚要搬50块石头,他想,只要先搬走49块,那剩下的一块就能搬完了,然后考虑那49块,只要先搬走48块,那剩下的一块就能搬完了……,递归是一种思想,只不过在程序中,就是依靠函数嵌套这个特性来实现了。
递归最明显的特点就是,自己调用自己。
例:
funca()
{
if(statement1)
funca();
else
exit(0);
}
3 总结
概括说,函数嵌套就是函数调用函数,是普遍的,递归就是函数调用自身,使函数嵌套的一个特例。
嵌套调用就是某个函数调用另外一个函数,递归调用是一个函数直接或间接的调用自己。
举几个例子:A调用B(嵌套)B调用C(嵌套)A调用A(递归)A 调用B B调用A (递归)A调用B B调用C C调用A (递归)。
教学内容:函数声明、函数嵌套调用、递归函数、数组做函数参数教学目标1.掌握函数声明的格式2.理解函数嵌套调用的过程3.理解函数递归调用的过程;掌握常用递归函数的编写4.掌握数组名作为函数参数的应用重点难点1.函数的递归调用2.数组名作为函数参数教学方法与手段1.讲授、实验法2.多媒体教学内容及教学过程一.函数的声明⏹如果使用自己定义的函数,而该函数的位置在调用它的函数后面,应该声明示例说明:输入两个实数,用一个函数求出它们之和。
#include <stdio.h>int main( ){ float add(float x, float y); //函数声明语句float a,b,c;printf("Please enter a and b:");scanf("%f,%f",&a,&b);c=add(a,b);printf("sum is %f\n",c);return 0;}float add(float x,float y){ float z;z=x+y;return(z);}⏹函数声明的形式:float add(float x, float y); float add(float, float);二.函数的嵌套调用◆ C语言的函数定义是互相平行、独立的◆ 即函数不能嵌套定义◆ 但可以嵌套调用函数◆ 即调用一个函数的过程中,又可以调用另一个函数三.函数的递归调用1、函数递归调用的概念在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用2、递归函数示例age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2 age(2)=age(1)+2age(1)=10递归的两个阶段:回溯阶段和递推阶段#include <stdio.h>int main(){ int age(int n);printf("NO.5,age:%d\n",age(5));return 0;}int age(int n){ int c;if(n==1) c=10;else c=age(n-1)+2;return(c);}3、用递归方法求n !)1(2)1()()1(10)(>+-===n n age n age n n age ⎧===)1,0(1!!n n nint fac(int n){int f;if(n<0)printf("n<0,data error!");else if(n==0 | | n==1)f=1;else f=fac(n-1)*n;return(f);}注意溢出4、Hanoi塔问题介绍Hanoi塔问题的设计思路,理解算法思想即可。
C++函数的嵌套调⽤和递归调⽤学习教程C++函数的嵌套调⽤C++不允许对函数作嵌套定义,也就是说在⼀个函数中不能完整地包含另⼀个函数。
在⼀个程序中每⼀个函数的定义都是互相平⾏和独⽴的。
虽然C++不能嵌套定义函数,但可以嵌套调⽤函数,也就是说,在调⽤⼀个函数的过程中,⼜调⽤另⼀个函数。
在程序中实现函数嵌套调⽤时,需要注意的是:在调⽤函数之前,需要对每⼀个被调⽤的函数作声明(除⾮定义在前,调⽤在后)。
【例】⽤弦截法求⽅程f(x)=x3-5x2+16x-80=0的根。
这是⼀个数值求解问题,需要先分析⽤弦截法求根的算法。
根据数学知识,可以列出以下的解题步骤:1) 取两个不同点x1,x2,如果f(x1)和f(x2)符号相反,则(x1,x2)区间内必有⼀个根。
如果f(x1)与f(x2)同符号,则应改变x1,x2,直到f(x1), f(x2)异号为⽌。
注意x1?x2的值不应差太⼤,以保证(x1,x2)区间内只有⼀个根。
2) 连接(x1, f(x1))和(x2, f(x2))两点,此线(即弦)交x轴于x,见图。
x点坐标可⽤下式求出:再从x求出f(x)。
3) 若f(x)与f(x1)同符号,则根必在(x, x2)区间内,此时将x作为新的x1。
如果f(x)与f(x2)同符号,则表⽰根在( x1,x)区间内,将x作为新的x2。
4) 重复步骤 (2) 和 (3),直到 |f(x)|<ξ为⽌,ξ为⼀个很⼩的正数,例如10-6。
此时认为 f(x)≈0。
这就是弦截法的算法,在程序中分别⽤以下⼏个函数来实现以上有关部分功能:1) ⽤函数f(x)代表x的函数:x3-5x2+16x-80。
2) ⽤函数xpoint (x1,x2)来求(x1,f(x1))和(x2,f(x2))的连线与x轴的交点x的坐标。
3) ⽤函数root(x1,x2)来求(x1,x2)区间的那个实根。
显然,执⾏root函数的过程中要⽤到xpoint函数,⽽执⾏xpoint函数的过程中要⽤到f函数。
7.5 函数的正确调⽤(嵌套调⽤,递归调⽤)
1.调⽤函数时,函数名必须与被调⽤的函数名字完全⼀样。
实参的个数与类型和形参的个数与类型⼀致。
2.C语⾔规定:函数必须先定义,后调⽤,也就是被调⽤函数必须在调⽤之前加以说明,或被调⽤函数整个放在调⽤函数之前。
但对返回值类型为int或char类型的函数可以放在调⽤函数的后⾯。
3.C语⾔中函数定义都是互相平⾏、独⽴的,C语⾔不允许嵌套定义函数,但允许嵌套调⽤函数,也就是说,在调⽤⼀个函数的过程中,⼜调⽤另⼀个函数。
4.在C程序中,调⽤⼀个函数的过程中⼜出现直接或间接地调⽤该函数本⾝,称为函数的递归调⽤。
5.递归调⽤函数是C语⾔的特点之⼀,有时递归调⽤会使求解的问题变得更简单明了。