函数的嵌套调用和递归调用.ppt

上传人:人*** 文档编号:568803980 上传时间:2024-07-26 格式:PPT 页数:13 大小:438.81KB
返回 下载 相关 举报
函数的嵌套调用和递归调用.ppt_第1页
第1页 / 共13页
函数的嵌套调用和递归调用.ppt_第2页
第2页 / 共13页
函数的嵌套调用和递归调用.ppt_第3页
第3页 / 共13页
函数的嵌套调用和递归调用.ppt_第4页
第4页 / 共13页
函数的嵌套调用和递归调用.ppt_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《函数的嵌套调用和递归调用.ppt》由会员分享,可在线阅读,更多相关《函数的嵌套调用和递归调用.ppt(13页珍藏版)》请在金锄头文库上搜索。

1、函数的嵌套调用C C语言中,所有函数的定义都是互相平行和独立的,语言中,所有函数的定义都是互相平行和独立的,语言中,所有函数的定义都是互相平行和独立的,语言中,所有函数的定义都是互相平行和独立的,一个函数的定义不能包含另一个函数的定义,即一个函数的定义不能包含另一个函数的定义,即一个函数的定义不能包含另一个函数的定义,即一个函数的定义不能包含另一个函数的定义,即不允许函不允许函不允许函不允许函数的嵌套定义数的嵌套定义数的嵌套定义数的嵌套定义,但函数的调用可以但函数的调用可以但函数的调用可以但函数的调用可以通过一个函数来调用另通过一个函数来调用另通过一个函数来调用另通过一个函数来调用另一个函数来

2、实现,这就形成了函数的一个函数来实现,这就形成了函数的一个函数来实现,这就形成了函数的一个函数来实现,这就形成了函数的嵌套调用嵌套调用嵌套调用嵌套调用。下面是一个两层嵌套的例子:下面是一个两层嵌套的例子:下面是一个两层嵌套的例子:下面是一个两层嵌套的例子: 例例例例7 799利用公式:利用公式:利用公式:利用公式: e=1+1/1!+1/2!+1/3!+1/4!+ e=1+1/1!+1/2!+1/3!+1/4!+ 近似计算自然数近似计算自然数近似计算自然数近似计算自然数e e。算法按两层进行:算法按两层进行:算法按两层进行:算法按两层进行: 函数函数函数函数fac_vfac_v() ()计算计

3、算计算计算1/m!(m=1,2,3, . ,n).1/m!(m=1,2,3, . ,n). 函数函数函数函数cai_ecai_e() ()计算整个公式右边之和,作为计算整个公式右边之和,作为计算整个公式右边之和,作为计算整个公式右边之和,作为e e的近似值。的近似值。的近似值。的近似值。 函数函数函数函数cai_ecai_e() ()调用函数调用函数调用函数调用函数fac_vfac_v() ()以以以以获得获得获得获得1/m!1/m!的值,而主函数则调用的值,而主函数则调用的值,而主函数则调用的值,而主函数则调用cai_ccai_c 得到得到得到得到e e的近似值。的近似值。的近似值。的近似值

4、。函数的嵌套调用#include#includehmain()main()doubledoublecai_ecai_e( (intint) );intintn n;printfprintf( (”请输入一个正整数:请输入一个正整数:” ”) ):scanfscanf( (d”d”,&n)&n); printfprintf(“(“自自然然数数e e的的近近似似值值为为%l%lfn”,cai_efn”,cai_e(n)(n); doubledoublecai_ecai_e( (intintn)n)doubledoublefac_vfac_v( (intint) );doubleedoublee1

5、10 0;while(n)e+while(n)e+fac_fac_v(nv(n-) );return(e)return(e); doubledoublefac_vfac_v( (intintm)m)doublev=1doublev=10 0;while(m)v/=mwhile(m)v/=m- -;return(v)return(v); 函数的嵌套调用整个程序执行的流程如图所示:main()main()函数函数函数函数 调用调用调用调用cai_e(ncai_e(n) ) 结束结束结束结束 cai_e(ncai_e(n) )函数函数函数函数 调用调用调用调用fac_v(mfac_v(m) ) re

6、turn return语句语句语句语句 fac_v(mfac_v(m) )函数函数函数函数 return return语句语句语句语句 函数的递归调用 函数的递归调用是指一个函数直接或间接地调用了该函函数的递归调用是指一个函数直接或间接地调用了该函数本身,它有两种形式:数本身,它有两种形式: 直接递归调用直接递归调用 间接递归调用间接递归调用 1 1递归的形式递归的形式(1 1)直接递归)直接递归 例例7 71010下面函数下面函数sum()sum()计算整数和:计算整数和:1+2+3+4+n1+2+3+4+n。 longsum(longsum(intintn)n)if(nif(n1)retu

7、rn(1)1)return(1); return(return(sum(n-1)sum(n-1)+n)+n); 函数的递归调用(2 2)间接递归)间接递归上面的上面的sum()sum()函数改写成两个函数函数改写成两个函数acc()acc()和和add()add()来共同实现这个计算:来共同实现这个计算:longlongaccacc( (intintn)n)longadd(longadd(intint) );* *函数说明函数说明* * if(nif(nn) return ( if (mn) return (gcmgcm(m-(m-n,nn,n);); else return ( else r

8、eturn (gcmgcm(n-(n-m,mm,m);); 例例例例7 71313汉诺塔问题:有三根柱子编号为汉诺塔问题:有三根柱子编号为汉诺塔问题:有三根柱子编号为汉诺塔问题:有三根柱子编号为1 1、2 2、3 3,其中,其中,其中,其中1 1号柱上有若干号柱上有若干号柱上有若干号柱上有若干个大小不等的盘子,大的在下,小的在上。要求将柱个大小不等的盘子,大的在下,小的在上。要求将柱个大小不等的盘子,大的在下,小的在上。要求将柱个大小不等的盘子,大的在下,小的在上。要求将柱1 1上的盘子全部移到上的盘子全部移到上的盘子全部移到上的盘子全部移到柱柱柱柱3 3上,在移动的过程中可以借助于上,在移动

9、的过程中可以借助于上,在移动的过程中可以借助于上,在移动的过程中可以借助于2 2号柱,但一次只能移动一个盘子,且号柱,但一次只能移动一个盘子,且号柱,但一次只能移动一个盘子,且号柱,但一次只能移动一个盘子,且在移动过程中三根柱子上的盘子始终保持大盘在下,小盘在上的秩序。编在移动过程中三根柱子上的盘子始终保持大盘在下,小盘在上的秩序。编在移动过程中三根柱子上的盘子始终保持大盘在下,小盘在上的秩序。编在移动过程中三根柱子上的盘子始终保持大盘在下,小盘在上的秩序。编写函数完成,并输出其移动的步骤。写函数完成,并输出其移动的步骤。写函数完成,并输出其移动的步骤。写函数完成,并输出其移动的步骤。函数的递

10、归调用 1 2 31 2 3分析:可以设计函数分析:可以设计函数分析:可以设计函数分析:可以设计函数hanoi(n,x,y,zhanoi(n,x,y,z) )用来把柱用来把柱用来把柱用来把柱x x上的上的上的上的n n个盘子借助于个盘子借助于个盘子借助于个盘子借助于y y柱的帮柱的帮柱的帮柱的帮助移动到柱助移动到柱助移动到柱助移动到柱z z上。这个问题用递归表示为:上。这个问题用递归表示为:上。这个问题用递归表示为:上。这个问题用递归表示为:极端情形:当极端情形:当极端情形:当极端情形:当n=1n=1时,直接把时,直接把时,直接把时,直接把x x柱上的一个盘子移到柱上的一个盘子移到柱上的一个盘

11、子移到柱上的一个盘子移到z z柱上。柱上。柱上。柱上。递推关系:当递推关系:当递推关系:当递推关系:当n1n1时,把问题分成三个步骤:时,把问题分成三个步骤:时,把问题分成三个步骤:时,把问题分成三个步骤: (1 1)调用调用调用调用hanoi(n-1,x,z,y):hanoi(n-1,x,z,y):是先将是先将是先将是先将x x柱上的柱上的柱上的柱上的n-1n-1个盘子移到个盘子移到个盘子移到个盘子移到y y柱柱柱柱 (2 2)直接将直接将直接将直接将x x柱上的最后一个大盘子移到柱上的最后一个大盘子移到柱上的最后一个大盘子移到柱上的最后一个大盘子移到z z柱柱柱柱 (3 3)调用调用调用调

12、用hanoi(n-1,y,x,z):hanoi(n-1,y,x,z):最后将最后将最后将最后将y y柱上的柱上的柱上的柱上的n-1n-1个盘子移到个盘子移到个盘子移到个盘子移到z z柱柱柱柱只要只要只要只要n n不为不为不为不为1 1,就一直递归下去,直到极端情形的出口。,就一直递归下去,直到极端情形的出口。,就一直递归下去,直到极端情形的出口。,就一直递归下去,直到极端情形的出口。函数的递归调用程序表示:程序表示: void void hanoihanoi( (intint n,intn,int x,intx,int y,inty,int z) z) if ( n=1) if ( n=1)

13、printfprintf(“Take the dish to %d from %dn”,z,x);(“Take the dish to %d from %dn”,z,x); else else hanoi(n-1,x,z,y); hanoi(n-1,x,z,y); printfprintf(“Take the dish to %d from %d n”,z,x);(“Take the dish to %d from %d n”,z,x); hanoi(n-1,y,x,z); hanoi(n-1,y,x,z); 运行程序运行程序运行程序运行程序函数的递归调用 函数的递归调用是函数的递归调用是C C语言的一大特点,但她会耗费系统很语言的一大特点,但她会耗费系统很大的运行时间和内存空间,用得好是锦上添花,滥用则是会大的运行时间和内存空间,用得好是锦上添花,滥用则是会影响程序执行的效率。影响程序执行的效率。 实验要求:课后回去,自行补充好汉诺塔程序,在实验课实验要求:课后回去,自行补充好汉诺塔程序,在实验课上调试运行。上调试运行。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号