函数嵌套调用和递归调用
C语言中函数嵌套调用和递归调用

函数嵌套与递归调用的区别
函数嵌套是语言特性,递归调用是逻辑思想。
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 (递归)。
C语言第七讲 函数(2)

21
一、变量的存储空间分配概念
变量定义位置 变量的作用域 空间 (变量的使用范围)
变量的存储类别变量的生存期 时间
26
局部变量
二、变量的作用域——
局部变量(local variable)与全局变量(global variable)
例
void swap( ) { int t,x,y; t=x;x=y;y=t; } main() { int x=3,y=5; printf("x=%d,y=%d\n",x,y); swap( ); printf("x=%d,y=%d\n",x,y); }
斐波那契数列的递归方法实现。计算并输出斐波 那契数列的前7个数据。
1 当n =0, 1时
fib(n) =
fib(n-1)+ fib(n-2) 当n > 1时
int fib(int n) { if(n==0||n==1) return 1; else return fib(n-1)+fib(n-2); }
10
void main() { int n; for(n=11;n<=99;n++) if( absoluteprime(n) ) printf("%d\t",n); } /*判断一个数是否为绝对素数*/ int absoluteprime (int n) /*函数定义*/ { if(prime(n)==0) return 0; else if(prime(invert(n))==1) return 1; else return 0; }
06-函数嵌套调用与递归调用课件

int x, y, z, max; scanf("%d%d%d",&x,&y,&z); max = Max3(x, y, z); printf("max=%d\n",max); return 0; }
int Max3(int a, int b, int c) {
int max; max = Max(a, b); max = Max(max, c); return max; }
else f = n*fact(n-1);
y = fact(n);
return f;
printf("%d!=%ld\n", n,y);
}
}
main函数
fact函数
fact函数
fact函数
y=fact (3)
f=3*fact (2)
f=2*fact (1)
f=1
return 6
return 2
return 1
8
例4 用递归方法计算 n!
n!
1 n(n -
1)!
递归的终止条件 n 0,1 n 1
#include <stdio.h>
void main()
递归方式
long fact(int n)
{ long y;
{ long f;
int n;
if(n==1||n==0) f = 1;
scanf("%d", &n);
int age(int n); int n; scanf(("%d", &n); printf("NO. 5, age: %d\n" ,age(n));
c语言实验报告9 函数的嵌套调用和递归调用、数组作为函数参数

《C程序设计》课程实验报告学院:班级:姓名:学号:实验设备:计算机1台实验日期:2011年3月1日实验项目名称函数的嵌套调用和递归调用、数组作为函数参数实验目的掌握函数的嵌套调用和递归调用。
数组名作为函数参数的设计方法。
实验要求:掌握函数的嵌套调用和递归调用。
数组名作为函数参数的设计方法。
编写简单程序。
实验内容(包括步骤):1.编写程序,计算下列函数值:f(x,y)=其中,s(n)= =p(1)+p(2)+…p(n),p(i)=i!。
要求:(1)为函数p(i)、s(n)、f(x,y)均编写一个用户函数。
(2)x、y由键盘输入。
2.n个人按年龄从小到大站成一排,编号依次为1到n,年龄都相差2岁,且第一个人的年龄是10岁,问第n个的年龄是多大?要求:1)通过函数递归调用方式。
2)n的值从键盘输入。
3.有两个数组a、b,各有10个元素,分别统计出两个数组对应元素大于(a[i]>b[i])、等于(a[i]=b[i])和小于(a[i]<b[i])的次数。
要求:通过函数调用方式,并分别使用数组元素、和数组名作函数的参数。
4.编写程序,将一个n阶螺旋方阵放在二维数组中并把它们打印出来(最大元素放在中心,顺序为从上到下,从左到右的顺序依次从小到大存放,要求由函数自动生成阶螺旋方阵而不是人为地初始化或逐个赋值)。
要求:通过函数调用方式。
调试与结果测试:前三题调试正常结果正确,第四题不会做。
代码注释:9-1#include<stdio.h>int main(){float f(int x,int y);int a,b;float m;scanf("%d%d",&a,&b);m=f(a,b);printf("%f\n",m);return 0;}float f(int x,int y){int s(int i);float n;n=(double)s(x)/(double)s(y);return n;}int s(int a){int p(int i);int n,z=0;for(n=1;n<=a;n++)z=z+p(n);return z;}9-2#include<stdio.h>int main(){int age(int n);int n;scanf("%d",&n);printf("第%d个的年龄是%d岁\n",n,age(n));return 0;}int age(int n){int y;if(n==1)y=10;elsey=age(n-1)+2;return y;}9-3#include<stdio.h>int main(){int f(int x,int y);int a[10],b[10];int i,m=0,n=0,z=0;for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0;i<10;i++)scanf("%d",&b[i]);for(i=0;i<10;i++){if(f(a[i],b[i])==1)m++;if(f(a[i],b[i])==0)n++;else z++;}printf("大于的次数为%d,等于的次数为%d,小于的次数为%d\n",m,n,z);return 0;}int f(int x,int y){int flag;if(x>y)flag=1;else if(x==y)flag=0;else flag=2;return flag;}――――――――――――以下内容为教师填写―――――――――――――――教师评阅:成绩:良2011年月日。
函数的嵌套调用和递归调用

【程序设计】
--------------------------------------------------
功能:求k!(k〈13),所求阶乘的值作为函数值返回。
(要求使用递归)
------------------------------------------------*/
【程序填空】
---------------------------------------------------------
题目:下面程序的功能是用递归法求n!。
-------------------------------------------------------*/
#include
void main()
{
/***********SPACE***********/
【?】;
int n;
long y;
printf("input an integer number:");
scanf("%d",&n);
/***********SPACE***********/
y=【?】;
printf("%d!=%ld\n",n,y);
B) C语言程序中,main函数是没有参数的
C)一个函数通过其他函数间接的调用了自身,这种情况也是一种递归调用
D)若要通过函数参数带回一个或多个返回值,则应使用按地址传送的参数结合方式
答案:B
有以下程序:
#include
fun(int n)
{ if(n==1|| n==2)return 2;
c语言函数的嵌套和递归调用方法的实验小结

C语言函数的嵌套和递归调用方法的实验小结一、引言在C语言程序设计中,函数的嵌套和递归调用是两种常用的方法,它们在解决问题和实现特定功能时具有重要作用。
本文将结合实验结果,对C语言函数的嵌套和递归调用方法进行总结和分析,旨在加深对这两种方法的理解和应用。
二、函数的嵌套1. 概念与特点函数的嵌套是指在一个函数内部调用另一个函数。
当函数A中调用了函数B,函数B又调用了函数C,函数C又调用了函数D时,就形成了函数的嵌套调用。
函数的嵌套具有以下特点:(1)提高了程序的模块化和可读性,减少了代码的复杂度。
(2)可以在不同的函数之间传递参数,实现更灵活的功能组合。
(3)需要注意函数的声明顺序和作用域,避免出现未声明的函数引用错误。
2. 实验验证为了验证函数的嵌套调用,在实验中我们设计了一个简单的例子:编写两个函数,分别实现计算阶乘和计算组合数的功能,然后在主函数中进行嵌套调用,计算组合数的值。
实验结果表明,函数的嵌套调用可以实现相互依赖的功能模块,在程序设计中具有一定的灵活性和适用性。
三、递归调用1. 概念与特点递归调用是指一个函数在执行过程中调用了自身,从而形成了一种函数调用的循环结构。
通过递归调用,可以使函数不断重复执行,直到满足特定的条件才停止。
递归调用具有以下特点:(1)简化了程序的结构,使代码更加清晰和易于理解。
(2)能够处理一些需要多级嵌套的问题,极大地提高了代码的复用性和灵活性。
(3)需要设置递归调用的终止条件,避免形成无限循环,导致程序崩溃。
2. 实验验证为了验证递归调用的功能和特点,我们设计了一个典型的递归程序:计算斐波那契数列的前n项值。
实验结果表明,递归调用在实现该问题时具有简洁、高效的特点,使得代码易于阅读和理解,优雅地解决了该问题。
四、两种方法的比较1. 灵活性与适用性函数的嵌套调用主要适用于需要实现不同功能模块之间的交互和依赖关系的情况,具有较强的灵活性和可扩展性。
递归调用主要适用于解决问题具有明显的递归结构或需要多级嵌套的情况,具有较好的适用性和简洁性。
函数的嵌套调用和函数的递归调用没有区别

函数的嵌套调用和函数的递归调用没有区别函数调用是很多编程语言中经常使用的一个术语。
在编程语言中,函数可以被定义为一个可以产生特定输出的代码块,其中可以传递参数,被函数驱动,控制或处理的操作存在于函数的内部。
函数调用是指将特定函数作为另一个函数的一部分来调用它。
这两种形式的调用分别称为函数的嵌套调用和函数的递归调用。
函数的嵌套调用,是指将多个函数链接在一起,由一个函数来调用另一个函数,从而获得最终的结果。
这种函数调用的好处在于可以使代码的复用性和可读性提高,减少编写代码的复杂性,减少冗余代码,同时可以提高程序的可维护性和可扩展性。
函数的递归调用,则是指一个函数在其自身内部调用自身。
递归函数的核心特点是利用它自身的重复行为,来解决更高级别的问题。
在递归调用中,函数本身会被调用,而每次调用都会使函数获得新的参数值,当这些参数值等于特定条件时,函数就会终止,并返回一个结果。
有人可能觉得函数的嵌套调用和函数的递归调用有很大的区别,其实不然,两者的核心特点是一致的,他们的区别在于如何处理参数:在嵌套调用中,参数是由一个函数传给另一个函数的;而在递归调用中,函数是在其自身内部重复应用的,每次函数的参数值都会发生变化。
此外,递归调用还具备一定的边界条件,即当某个特定条件被满足时,函数将终止,并返回一个结果。
因此,函数的嵌套调用和函数的递归调用并没有太大的区别,但是,在实际编程中,我们还是可以根据实际的业务需求,选择合适的函数调用方式来实现最优的编程体验。
在嵌套调用中,可以最大限度地减少冗余代码,提高可读性;而在递归调用中,由于函数自身可以重复应用,使程序执行效率得到最大化,可以节约代码的量。
因此,函数的嵌套调用和函数的递归调用是相互补充的,当我们选择使用它们来编写程序时,可以根据实际的业务需求,根据特定问题设计出更优解决方案,从而获得更好的编程体验。
总之,不管是嵌套调用还是递归调用,它们都是编程中经常使用的一个术语。
函数嵌套调用或递归调用实现编程

函数嵌套调用或递归调用实现编程函数嵌套调用和递归调用是编程中常用的两种技术,它们可以使代码更加简洁、可读性更高,并且提高了代码的重用性。
本文将介绍函数嵌套调用和递归调用的概念、用法以及它们在编程中的应用。
1. 函数嵌套调用函数嵌套调用是指在一个函数的函数体内调用另一个函数。
通过函数嵌套调用,我们可以将一个大问题划分为多个小问题,并分别编写对应的函数来解决这些小问题。
这样做的好处是可以提高代码的可读性和可维护性,并且方便代码的重用。
下面是一个简单的例子,演示了函数嵌套调用的用法:```pythondef add(a, b):return a + bdef multiply(a, b):return a * bdef calculate(a, b):result1 = add(a, b)result2 = multiply(a, b)return result1 + result2result = calculate(2, 3)print(result) # 输出:11```在上面的例子中,我们定义了三个函数add、multiply和calculate,其中calculate函数通过函数嵌套调用了add和multiply函数。
通过这种方式,我们可以将加法和乘法的功能分别封装在独立的函数中,并在calculate函数中调用这两个函数来实现加法和乘法的功能。
最后,我们调用calculate函数并打印结果。
2. 递归调用递归调用是指一个函数调用自身的过程。
通常,递归调用用于解决可以被分解为同类子问题的问题,这样可以简化问题的解决过程。
在递归调用中,我们需要定义递归的终止条件,以避免无限递归。
下面是一个简单的例子,演示了递归调用的用法:```pythondef factorial(n):if n == 0:return 1else:return n * factorial(n - 1)result = factorial(5)print(result) # 输出:120```在上面的例子中,我们定义了一个factorial函数来计算一个数的阶乘。
递归调用和嵌套调用的概念

递归调用和嵌套调用的概念递归调用和嵌套调用是编程中常用的两种调用方式。
它们在实现算法和函数时都有各自的特点和应用场景。
首先,我们先来了解一下递归调用的概念。
递归调用是指在函数体内调用自身的一种方式。
通过递归调用,一个问题可以被分解为一个或多个与原问题相似但规模较小的子问题,并通过递归调用这些子问题得到解决方案。
递归调用通常包括两个部分:递归基和递归式。
递归基是指递归调用中最简单的情况,当达到递归基时,不再调用自身,而是直接返回结果。
递归式是指在递归调用过程中,将原问题转化为一个或多个更小规模的子问题,并利用同样的递归调用解决子问题。
递归调用有几个关键点需要注意。
首先,递归调用必须有递归基,否则递归将陷入无限循环。
其次,递归调用应该在每次调用时将问题规模减小,否则递归可能导致栈溢出。
最后,递归调用应该能够将子问题合并为原问题的解。
递归调用的一个经典应用是计算阶乘。
阶乘的定义是n的阶乘等于n乘以(n-1)的阶乘,其中0的阶乘定义为1。
通过递归调用,可以很方便地计算阶乘。
下面是一个计算阶乘的递归函数的示例代码:pythondef factorial(n):if n == 0: # 递归基return 1else:return n * factorial(n-1) # 递归式递归调用在解决一些问题时具有很大的优势,尤其是那些可以自然地划分为子问题的情况。
例如,在树的遍历、图的搜索等问题中,递归调用可以帮助我们简化代码和思路,提高代码的可读性和可维护性。
接下来,我们来了解一下嵌套调用的概念。
嵌套调用是指在一个函数体内调用另一个函数的一种方式。
通过嵌套调用,可以将一个复杂的任务分解为多个函数来完成。
嵌套调用通常包括两个部分:外层函数和内层函数。
外层函数负责调用内层函数,并将内层函数的结果作为自己的一部分结果进行处理。
内层函数则完成具体的子任务,并返回结果给外层函数。
嵌套调用的一个经典应用是计算一个列表中所有元素的和。
函数的嵌套调用和递归调用

说明: (1)一个C程序由一个或多个程序模块组成,每一个 程序模块作为一个源程序文件。 对于较大的程序,一般不把所有内容全放在一个源 程序文件中,而是将它们分别放在若干个源文件中, 由若干个源程序文件组成一个C程序。 这样便于分别编写、分别编译,提高调试效率。 一个源程序文件可以为多个C程序所调用。
解题思路:
要求第5个年龄,就必须先知道第4个年龄 要求第4个年龄必须先知道第3个年龄 第3个年龄又取决于第2个年龄 第2个年龄取决于第1个年龄 每个学生年龄都比其前1个学生的年龄大2
age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1)=10
课前预习将手机调到静音认真做笔记及时完成作业了解函数的含义学会定义和调用函数的方法函数的嵌套调用函数的递归调用函数的概念定义和调用函数函数的嵌套调用函数的递归调用71函数概述如果程序的功能比较多规模比较大把所有的程序代码都写在一个主函数中就会使主函数变得庞杂头绪不清使阅读和维护程序变得困难
上课要求
(2) 一个源程序文件由一个或多个函数以及其他有 关内容组成。一个源程序文件是一个编译单位,在 程序编译时是以源程序文件为单位进行编译的,而 不是以函数为单位进行编译的。 (3) 不论main函数出现在什么位置,总是从main函 数开始执行。如果在main函数中调用其他函数,在 调用后流程返回到main函数,在main函数中结束整 个程序的运行。
课前预习 将手机调到静音 认真做笔记 及时完成作业
学习目标
了解函数的含义 学会定义和调用函数的方法 函数的嵌套调用 函数的递归调用
学习内容
函数的概念 定义和调用函数 函数的嵌套调用 函数的递归调用
函数的嵌套及递归调用

四、函数的嵌套及递归调用
2.函数的递归调用
fac(4) =fac (3)*4
fac (4) =24
fac (3) =fac (2)*3
结束条件
fac (3) =6
fac (2) =fac (1)*2
fac (2) =2
递推阶段
fac (1) =1
回归阶段
四、函数的嵌套及递归调用
2.函数的递归调用 【例2】5个人坐在一起报岁数,问 第5个人几岁?他说比第4个人大两 岁;问第4个人几岁?他说比第3个 人大两岁;问第3个人几岁?他说比 第2个人大两岁;问第2个人几岁? 他说比第1个人大两岁;最后问第1 个人几岁?他说10岁。
四、函数的嵌套及递归调用
2.函数的递归调用 • 递推阶段:递推归纳,逐层调用,调用函数自身,直至
递归结束条件,这时递推阶段结束。
• 回归阶段:逐层求值回归,返回到调用该层的位置,结 束回归阶段,完成递归调用。
四、函数的嵌套及递归调用
2.函数的递归调用 【例1】用递归调用的方法求n!
n!=n*(n-1)*(n-2)*……*1=n(n-1)!。
四、函数的嵌套及递归调用
2.函数的递归调用
四、函数的嵌套及递归调用
2.函数的递归调用 一个函数(除主函数)直接或间接调用自己称为递归调用。
直接递归
间接递归
四、函数的嵌套及递归调用
2.函数的递归调用
递归(recursion)满足2个条件: ①有反复执行的过程(调用自身) ②有跳出反复执行过程的条件(递归出口)。
四、函数的嵌套及14
10
有终止 18 16
age(n)
10 age(n
1)
2
n 1 n 1
语言函数的嵌套调用和递归调用 PPT

5、4、2 函数得递归调用(嵌套调用得特例 )
概念:函数直接或间接地自我调用称为递归函数。
int fun1(int x)
int fun1(int x)
int fun2(int t)
{
{
{
…
…
…
z=fun1(y);
z=fun2(y);
c=fun1(a);
…
…
…
}
直接引用自身 } 间接引用自身
改定义范围。
G得范围
#define G 9、8 void main(void ) { … } #undef G
#define R 3、0 #define PI 3、14159 #define S PI*R*R printf(“S=%f”,S);
不替换
⑷ 宏定义允许嵌套(在字符串中使用已定义得宏名)。
printf(“\n”);
}
外部变量应用见p143 例 5、
19
综
#include<stdio、h> int i=1;
合 void other(void);
举
void main() { static int a;
例: int b=-10,c=0;
运行结果:
i=1,a=0,b=-10,c=0 i=33,a=4,b=0,c=15 i=33,a=0,b=-10,c=8 i=75,a=6,b=4,c=15
printf(“i=%d,a=%d,b=%d,c=%d\n”,i,a,b,c);
c=c+8;
other();
printf(“i=%d,a=%d,b=%d,c=%d\n”,i,a,b,c);
i=i+10; other();
C++函数的嵌套调用和递归调用学习教程

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函数。
函数的嵌套与递归调用

函数的递归调用
定义:函数直接或间接的调用自身叫函数的递归调用
int f(int x) { int y,z;
…… z=f(y); ……. return(2*z); }
f( )
int f1(int x) { int y,z;
…… z=f2(y); ……. return(2*z); }
int f2(int t) { int a,c;
…… c=f1(a); ……. return(3+c); }
f1( )
f2( )
1.C语言中,函数可以嵌套调用,不可以嵌套定义 2.函数递归调用指对函数自身的调用,算法描述为
a.if (递归终止条件) return (条件终止时的值) b.else return 递归公式
1.求两个数的最大公约数(用递归调用) 2.求两个数的最小公倍数(用嵌套调用)
调f
调f2
调f1
函数递归调用应用
例2:用递归法计算n!
1
(n=0,1)
n!=
n*(n-1)! (n>1)
例3:Hanoi(汉诺)塔问题。这是一个古典的数学问题,是一 个只有用递归方法(而不可能用其他方法)解决的问题。问题 是这样的:古代有一个梵塔,塔内有3个座A、B、C,开始时A 座上有64个盘子,盘子大小不等,大的在下,小的在上(如 图)。有一个老和尚想把这64个盘子从A座移到C座,但每次只 允许移动一个盘,且在移动过程中在3个座上都始终保持大盘 在下,小盘在上。在移动过程中可以利用B座,要求编程序打 印出移动的步骤。
01-函数的嵌套调用和递归调用

函数的递归调用
函数直接或间接调用自己,称为递归调用(Recursive Call)
这样的函数,称为递归函数(Recursive Function)
n!
1 n
(≥n 21)!
n0, 1 n
long Fact(int n)
{
if (n < 0)
return -1;
else if (n==0 || n==1)
但可以嵌套调用
– 在调用一个函数的过程中又调用另一个函数
int main()
long Comb(int m, int k)
{ … … ret=Comb(m,k);
{ … s = Fact(m)/(Fact(k)*Fact(m-k));
…
return 0; }
return s; }
C语言程序设计
Ck m
第6章 函数
——函数的嵌套调用与递归调用
哈尔滨工业大 学 苏小红
sxh@
第6章 函数
本节要讨论的主要问题
什么是嵌套调用和递归调用? 递归函数的两个基本要素是什么? 递归调用可以终止的条件是什么? 什么情况下考虑使用递归?
C语言程序设计
第6章 函数
函数的嵌套调用
函数不能嵌套定义
void Hanoi(int n, char a, char b, char c); void Move(int n, char a, char b); int main() {
int n; printf("Input the number of disks:"); scanf("%d", &n); printf("steps of moving %d disks from A to B by means of C:\n", n); Hanoi(n, 'A', 'B', 'C'); return 0; }
用递归的与函数嵌套调用的方法求台劳级数

课程实验报告课程名称:班级日期成绩评定姓名实验室老师签名学号实验名称所用软件VC++6.0实验目的及内容实验原理步骤、(1)解题思路:(你参考一下,6.1.8编程实例那一节)定义一个函数,power(x,n)=x^n/(n!);函数里面的下面语句if(n==1)c=x;elsec=(power(x,n-1)*x)/n;return c;通过递归的调用自己,得出结果。
这个函数可以表示,x,x^2/(2!),…….再定义一个和函数,Sum(x,n)=power(x,1)+power(x,2)+…..利用下面的语句for(int k=i=1;i<=n;i+=2,k++){ if(k%2==0)s=s-power(x,i);elses=s+power(x,i);}通过在和函数里,嵌套调用power函数,就可以得出来结果。
(2)调试过程:int main(int argc, char* argv[]){ float sum(int n);float x=1;float y;y=sum(20);cout<<y<<'\n';return 0;}float sum(int n){float power(float x,int n);float s;int i;s=power(x,1);for(i=1;i<=n;i+=2){s=s+power(x,n)*(-1);}return s;}float power(float x,int n){ float c;if(n==1)c=x;elsec=power(x,n-1)*x/n;return c;}编译时调试中遇到的问题:Compiling...223.cppF:\C\3\223.cpp(6) : error C2065: 'cout' : undeclared identifierF:\C\3\223.cpp(6) : error C2296: '<<' : illegal, left operand has type 'float'F:\C\3\223.cpp(6) : error C2297: '<<' : illegal, right operand has type 'float'执行cl.exe 时出错.3.exe - 1 error(s), 0 warning(s)经检查是没有语句,#include<iostream.h> 导致不能调用cout函数.加入语句后再调试出现:Compiling...2.cppF:\C\2\2.cpp(20) : error C2065: 'x' : undeclared identifier执行cl.exe 时出错.2.exe - 1 error(s), 0 warning(s)经检查,原来,嵌套调用的函数sum与power,sum函数并没有声明形参x,就调用了power(float x,int n)函数形式,导致编译时,并不知道,x是什么.将程序改正,将float sum(int n);改为,float sum(float x,int n), y=sum(20);改为y=sum(1.5,20);调试后,出现,2.exe - 0 error(s), 0 warning(s)说明编译已经通过。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
练习
• 例:编写求组合数的函数。
Cmn
m! n!(m n)!
6.9.2 函数的递归调用
递归: 一个函数直接或间接地使用自身。 1. 直接递归调用:函数直接调用本身 2. 间接递归调用:函数间接调用本身
直接调用
int f(int x) { int y,z;
…… z=f(y); ……. return(2*z); }
A
B
C
n个盘子
必须用递归方式解决,将n阶问题转为n-1阶:
1) 先将A塔n –1个盘子借助于C移至B上: 2) 将A上剩下的一个移至C上.
3) 将B上n –1个盘子借助于A移至C上. 可以看到:
1)、3)为同一问题,都为n –1个盘子借助于 一个空塔移至另一塔上。 递归出口:n=1,此时A座上只有一个盘子,直 接将其移动到C座上即可。
age( int 1n ) {
int c; if (n==1) c=10;
return c; }
age( int n3 ) {
int c;
else c= age( n2 -1 ) +2
return c; }
age( int 2n ) {
int c;
else c=age( n1 -1 ) +2
return c; }
《C语言程序设计》
学习内容: 函数的嵌套调用和递归调用
6.9 函数的嵌套调用和递归调用
引例
编程函数求解:
y=(x+y)2 ! 然后调用函数求解(2+3)2!以及(3+4)2! 要求:
1、首先编写求和函数,求解x+y的和。 2、编写函数求解(x+y) 的平方(x+y)2 3、编写函数求解(x+y)2!
}
§C语言允许在一个函数的定义中出现对另一个函数 的调用(使用)。这样就出现了函数的嵌套调用,即在 被使用函数中又调用其他函数。
main( )函 数
①
②
f1( )函 数
③
④
f2( )函 数
调 用 f1( )函 数 调 用 f2( )函 数
⑤
后续语句
后续语句
⑨
⑧
结束
⑦
⑥
返回
返回
#include <stdio.h> long sum(int a, int b);
总结:递归算法
递归函数名f(参数x) { if (x==初值) //递归结束的条件
结果=…; else
结果=含f(x-1)的表达式;
main() { f(n) …
}
返回结果(return); }
f(1或者0) { f(0)== …)
}
f(n) { f(n-1) }
f(n-1) { f(n-2) }
r=x>y?x:y; return(r>z?r:z); }
int min(int x,int y,int z) { int r;
r=x<y?x:y; return(r<z?r:z); }
练习
g(x,y)=
f( x+y) 2
x+y
(x<=y)
f(x-y) 2
x+y
( x>y)
其中:f(t)=(1+e-t)/(1+et) 求result=g(2.5,3.4)。
#include "stdio.h" void move(int n,char x,char y,char z) { if(n==1)
printf("%c-->%c\n",x,z); else { move(n-1,x,z,y); //n-1盘子已经到y上
printf("%c-->%c\n",x,z); move(n-1,y,x,z); // y上n-1盘子想办法放到z } }
c=10
age(2)
c=age(4)+2; c=age(3)+2; c=age(2)+2; c=age(1)+2;
return c;
c=18
return c;
c=16
return c;
c=14
return c;
c=12
main() {
int x;
x=age(3);
printf("%d",x); }
main() {
long x; x=jc(6); printf("%ld",x); }
long jc(int n) { long k;
int i; for(i=1;i<=n;i++) k=k*i; return k; } main() { long x; x=jc(6); printf("%ld",x); }
A
B
C
A >C A >B C >B A >C B >A B >C A >C
练习
1、用递归方法求和:
1!+2!+3!+4!+5!…+n!
其中n的值由键盘输入。 2、有5个人,第5个人说他的钱是第4个人的2 倍还多100元,第4个人说他是第3个人的2倍还 多100,第3个人说他是第2个人的2倍还多100, 第2个人说他是第1个人的2倍还多100,第1个 人说他1000元。求第5个人有多少钱。
int sum(int x, int y) { return (x+y); }
int pf ( int h) { return (h*h); }
6.9.1 函数的嵌套调用
§C语言中不允许嵌套的函数定义,各函数之 间是平行的,不存在上一级函数和下一级函数 的问题。 void print( )
{ putchar('*'); void prnline( int n) { int i; for(i=0;i<=n;i++) putchar('\n'); }
间接调用
int f1(int x) int f2(int t)
{ int y,z; { int a,c;
……
……
z=f2(y);
c=f1(a);
…….
…….
return(2*z); return(3+c);
}
}
【例1】有5个人,第5个人说他比第4个人大2 岁,第4个人说他对第3个人大2岁,第3个人说 他对第2个人大2岁,第2个人说他比第1个人大 2岁,第1个人说他10岁。求第5个人多少岁。
main() {
int n; printf (" input the number of diskes " :); scanf("%d",&n); move(n,'a','b','c'); }
运行情况如下: input the number of diskes:3 A >C A >B C >B A >C B >A B >C A >C
f(n-2) { f(n-3) }
例2:用递归算法计算n! n!=n*(n-1)! (n-1)!=(n-1) *(n-2)! ………………….. 5!=5*4! 4!=4*3! 3!=3*2! 2!=2*1! 1!=1
long jc(int n) { long k;
if(n==1) k=1; else k=n*jc(n-1); return k; }
函数定义
{ long factorial(int n); 形参
long factorial(int n) { long rtn=1;
int i; for(i=1;i<=n;i++) rtn*=i; return(rtn); }
long c1,c2;
c1=factorial(a); 函数调用
c2= factorial(b);
if ((n==1) || (n==2)) return 1; else return (fib(n-1)+fib(n-2)); }
main() {
int i; printf("\n"); printf(" %d",fib(20));
}
例4: 汉诺塔(Hanoi)问题
问题: 将A塔上n个盘子移至C(借助于B)。 移动时, 保证三个塔始终是大盘在下,小盘在上。
main() { int a,b,c;
scanf(“%d,%d”,&a,&b);
c= jc(a,b);
printf(“sum is %d",c); }
int jc(int k, int j) { int z,m,i,s=1;
z=sum(k, j); m= pf(z); for(i=1;i<=m;i++) s=s*i; return s; }
return(c1+c2ห้องสมุดไป่ตู้; 函数返回值
}
例 2求三个数中最大数和最小数的差值
#include <stdio.h> int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z); void main() { int a,b,c,d;
例3、用递归法计算Fibonacci序列的第20项。
f= 1
n=1或者n=2
f(n-1)+f(n-2) n>2