函数嵌套调用和递归调用_第1页
函数嵌套调用和递归调用_第2页
函数嵌套调用和递归调用_第3页
函数嵌套调用和递归调用_第4页
函数嵌套调用和递归调用_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论