![函数嵌套调用和递归调用_第1页](http://file4.renrendoc.com/view10/M01/2E/11/wKhkGWWV1KmAdUXkAADjcfvk9cc035.jpg)
![函数嵌套调用和递归调用_第2页](http://file4.renrendoc.com/view10/M01/2E/11/wKhkGWWV1KmAdUXkAADjcfvk9cc0352.jpg)
![函数嵌套调用和递归调用_第3页](http://file4.renrendoc.com/view10/M01/2E/11/wKhkGWWV1KmAdUXkAADjcfvk9cc0353.jpg)
![函数嵌套调用和递归调用_第4页](http://file4.renrendoc.com/view10/M01/2E/11/wKhkGWWV1KmAdUXkAADjcfvk9cc0354.jpg)
![函数嵌套调用和递归调用_第5页](http://file4.renrendoc.com/view10/M01/2E/11/wKhkGWWV1KmAdUXkAADjcfvk9cc0355.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《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!main(){int
a,b,c;
scanf(“%d,%d”,&a,&b);
jc(a,b);
printf(“sumis%d",c);}int
jc(intk,intj){int
z,m,i,s=1;
sum(k,j);
pf(z);
for(i=1;i<=m;i++)s=s*i;
returns;}int
sum(intx,inty){
return(x+y);}intpf(inth){
return(h*h);}c=z=m=6.9.1函数的嵌套调用C语言中不允许嵌套的函数定义,各函数之间是平行的,不存在上一级函数和下一级函数的问题。voidprint(){
putchar('*');
voidprnline(intn){inti;
for(i=0;i<=n;i++)
putchar('\n');}}C语言允许在一个函数的定义中出现对另一个函数的调用(使用)。这样就出现了函数的嵌套调用,即在被使用函数中又调用其他函数。#include<stdio.h>
longsum(inta,intb);longfactorial(intn);main(){intn1,n2;longa;scanf("%d,%d",&n1,&n2);a=sum(n1,n2);
printf("a=%1d",a);}longsum(int
a,intb){longc1,c2;
factorial(a);
factorial(b);
return(c1+c2);}
longfactorial(intn){longrtn=1;
inti;for(i=1;i<=n;i++)
rtn*=i;
return(rtn);}longsum(inta,intb);longfactorial(intn);文件包含编译预处理命令函数声明函数定义函数调用函数调用函数返回值形参实参c1=c2=
longfactorial(intn){longrtn=1;
inti;for(i=1;i<=n;i++)
rtn*=i;
return(rtn);}例2求三个数中最大数和最小数的差值#include<stdio.h>
int
dif(int
x,int
y,intz);
int
max(int
x,int
y,intz);
int
min(int
x,int
y,intz);voidmain(){int
a,b,c,d;
scanf("%d%d%d",&a,&b,&c);
d=dif(a,b,c);
printf("Max-Min=%d\n",d);}int
min(int
x,int
y,intz){intr;r=x<y?x:y;
return(r<z?r:z);}int
max(int
x,int
y,intz){intr;r=x>y?x:y;
return(r>z?r:z);}int
dif(int
x,int
y,intz){returnmax(x,y,z)-min(x,y,z);}
f(x+y)2x+y(x<=y)
g(x,y)=f(x-y)2x+y(x>y)
其中:f(t)=(1+e-t)/(1+et)求result=g(2.5,3.4)。练习练习例:编写求组合数的函数。6.9.2函数的递归调用
递归:
一个函数直接或间接地使用自身。
1.直接递归调用:函数直接调用本身
2.间接递归调用:函数间接调用本身int
f(intx){inty,z;……
z=f(y);…….return(2*z);}int
f1(intx){inty,z;……
z=f2(y);…….return(2*z);}int
f2(intt){inta,c;……
c=f1(a);…….return(3+c);}直接调用间接调用【例1】有5个人,第5个人说他比第4个人大2岁,第4个人说他对第3个人大2岁,第3个人说他对第2个人大2岁,第2个人说他比第1个人大2岁,第1个人说他10岁。求第5个人多少岁。通过分析,设计递归函数如下:
10(n=1)age(n)=age(n-1)+2(n>1)递归函数:
10(n=1)age(n)=age(n-1)+2(n>1)age(intn){
intc;if(n==1)c=10;elsec=age(n-1)+2;returnc;}main(){
intx;x=age(5);
printf("%d",x);}程序如下:请看看单步运行的情况……
age(5)
c=age(4)+2;
returnc;age(intn){
intc;if(n==1)c=10;elsec=age(n-1)+2;returnc;}递归过程跟踪分析:
age(4)
c=age(3)+2;
returnc;
age(3)
c=age(2)+2;
returnc;
age(2)
c=age(1)+2;
returnc;
age(1)
c=10
returnc;c=10c=12c=14c=16c=18main(){
intx;age(3);
printf("%d",x);}age(intn){
intc;
elsereturnc;}3age(n-1)2age(intn){
intc;
elsereturnc;}2age(n-1)1age(intn){
intc;if(n==1)c=10;
returnc;}1c=+2+2c=x=总结:递归算法递归函数名f(参数x){if(x==初值)//递归结束的条件
结果=…;else
结果=含f(x-1)的表达式;返回结果(return);}f(n){f(n-1)
}main(){f(n)…}f(n-1){f(n-2)
}f(n-2){f(n-3)
}f(1或者0){f(0)==…)
}例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
longjc(intn){longk;
if(n==1)k=1;elsek=n*jc(n-1);returnk;}main(){longx;x=jc(6);
printf("%ld",x);}
longjc(intn){longk;
inti;
for(i=1;i<=n;i++)k=k*i;returnk;}main(){longx;x=jc(6);
printf("%ld",x);}
例3、用递归法计算Fibonacci序列的第20项。f=1n=1或者n=2f(n-1)+f(n-2)n>2
根据数学公式,很容易将n阶的问题转化成n-1阶和n-2阶的问题,即:f(n)=f(n-1)+f(n-2),递归出口:n=1或者n=2。程序如下:#include"stdio.h"int
fib(intn){if((n==1)||(n==2))return1;elsereturn(fib(n-1)+fib(n-2));}main(){
inti;
printf("\n");
printf("%d",fib(20));}例4:
汉诺塔(Hanoi)问题BC问题:
将A塔上n个盘子移至C(借助于B)。移动时,保证三个塔始终是大盘在下,小盘在上。An个盘子必须用递归方式解决,将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座上即可。
#include"stdio.h"voidmove(intn,charx,chary,charz){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}}
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 某某合作社农产品市场信息共享及数据分析合同2025年
- 2024年12月泉州惠安县人才服务工作人员公开招聘1人笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 2025外墙涂料喷涂机器人施工工艺
- 神经病学绪论课件
- Unit 1 Lesson 2 What's your name,please 【知识精研】闽教版(2024)英语三年级上册3
- (高清版)DB37∕T 2997-2017 干旱山地造林雨水蓄存利用工程建设技术规程
- 4.2 我国的社会保障 【知识精研】高中政治统编版必修二经济与社会
- 《小学生缩句方法》课件
- 2025至2031年中国大安装板总行业投资前景及策略咨询研究报告
- 2025至2031年中国医用乳胶检查手套行业投资前景及策略咨询研究报告
- (新版)山东省物流工程师职称考试参考试题库-下(多选、判断题)
- 货运有限公司2024年春节后复工复产安全生产方案
- 课程设计存在问题和建议
- 食品安全员专业知识考试题库(含答案)
- 和客户签回款协议书范本
- 2024年孝感中小学教师招聘真题
- DBJ50-T-420-2022建设工程配建5G移动通信基础设施技术标准
- 年“春节”前后安全自查系列用表完整
- 社交礼仪-仪态礼仪
- 2024暑期夏日露营潮趣互动音乐节(唱享潮夏旋律季)活动策划方案
- 临床成人ICU患者外周动脉导管管理要点
评论
0/150
提交评论