4.6函数的递归调用(课件)-高一《程序设计基础》同步教学(江苏教育出版社)

2023-07-29
| 17页
| 168人阅读
| 2人下载
普通

内容正文:

任务六 函数的递归调用 一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。 例如, long f(long x) { long y; z=f(y); return z; } 这个函数是一个递归函数。但是运行该函数将无休止地调用其自身,这当然是不正确的。为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。常用的办法是加条件判断,满足某种条件后就不再作递归调用,然后逐层返回。 任务六 函数的递归调用 【例4-6】 用递归法计算n!。 long ff(int n) { long f; if(n<0) printf("n<0,input error"); else if(n==0||n==1) f=1; else f=ff(n-1)*n; return(f); } main() { int n; long y; printf("\ninput a inteager number: \n"); scanf("%d",&n); y=ff(n); printf("%d!=%ld",n,y); } 用递归法计算n!可用下述公式表示: n!=1(n=0,1) n!=n×(n-1)!(n>1) 任务六 函数的递归调用 【例4-7】 Hanoi塔问题。 本题算法:设A上有n个盘子。 如果n=1,则将圆盘从A直接移动到C。 如果n=2,则: (1) 将A上的n-1(等于1)个圆盘移到B上。 (2) 再将A上的一个圆盘移到C上。 (3) 最后将B上的n-1(等于1)个圆盘移到C上。 如果n=3,则: (1)将A上的n-1(等于2,令其为n)个圆盘移到B(借助于C),步骤如下: ① 将A上的n-1(等于1)个圆盘移到C上。 ② 将A上的一个圆盘移到B上。 ③ 将C上的n-1(等于1)个圆盘移到B上。 (2)将A上的一个圆盘移到C上。 (3) 将B上的n-1(等于2,令其为n)个圆盘移到C上(借助A),步骤如下: ① 将B上的n-1(等于1)个圆盘移到A上。 ② 将B上的一个盘子移到C上。 ③ 将A上的n-1(等于1)个圆盘移到C上。 到此,完成了三个圆盘的移动过程。 一块板上有三根针,分别为A、B、C。A针上套有64个大小不等的圆盘,大的在下,小的在上。要把这64个圆盘从A针移动到C针上,每次只能移动一个圆盘,移动可以借助B针进行。但在任何时候,任何针上的圆盘都必须保持大盘在下,小盘在上。 任务六 函数的递归调用 从上面分析可以看出,当n≥2时,移动的过程可分解为三个步骤: (1)第一步: 把A上的n-1个圆盘移到B上。 (2)第二步: 把A上的一个圆盘移到C上。 (3)第三步: 把B上的n-1个圆盘移到C上;其中第一步和第三步是类同的。 当n=3时,第一步和第三步又分解为类同的三步,即把n-1个圆盘从一个针移到另一个针上,这里的n=n-1。 显然这是一个递归过程。 【例4-7】 Hanoi塔问题。 任务六 函数的递归调用 程序: move(int n,int x,int y,int z) { if(n==1) printf("%c-->%c\n",x,z); else { move(n-1,x,z,y); printf("%c-->%c\n",x,z); move(n-1,y,x,z); } } main() { int h; printf("\ninput number: \n"); scanf("%d",&h); printf("the step to moving %2d diskes: \n",h); move(h,a,b,c); } 【例4-7】 Hanoi塔问题。 运行结果: input number: 4 the step to moving 4 diskes: a→b a→c b→c a→b c→a c→b a→b a→c b→c b→a c→a b→c a→b a→c b→c 任务六 函数的递归调用 任务七 数组作为函数参数 数组元素就是下标变量,它与普通变量并无区别, 因此它作为函数实参使用与普通变量是完全相同的。在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。 1. 数组元素作函数实参 任务七 数组作为函数参数 void nzp(int v) { if(v>0) printf("%d ",v); else printf("%d ",0); } main() { int a[5],i; printf("input 5 numbers\n"); for(i=0;i<5;i++) {scanf("%d",&a[i]); nzp(a

资源预览图

4.6函数的递归调用(课件)-高一《程序设计基础》同步教学(江苏教育出版社)
1
4.6函数的递归调用(课件)-高一《程序设计基础》同步教学(江苏教育出版社)
2
4.6函数的递归调用(课件)-高一《程序设计基础》同步教学(江苏教育出版社)
3
4.6函数的递归调用(课件)-高一《程序设计基础》同步教学(江苏教育出版社)
4
4.6函数的递归调用(课件)-高一《程序设计基础》同步教学(江苏教育出版社)
5
4.6函数的递归调用(课件)-高一《程序设计基础》同步教学(江苏教育出版社)
6
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。