C程序设计教案252课时——函数的递归调用.docx

上传人:lao****ou 文档编号:405685 上传时间:2023-10-24 格式:DOCX 页数:7 大小:28.01KB
下载 相关 举报
C程序设计教案252课时——函数的递归调用.docx_第1页
第1页 / 共7页
C程序设计教案252课时——函数的递归调用.docx_第2页
第2页 / 共7页
C程序设计教案252课时——函数的递归调用.docx_第3页
第3页 / 共7页
C程序设计教案252课时——函数的递归调用.docx_第4页
第4页 / 共7页
C程序设计教案252课时——函数的递归调用.docx_第5页
第5页 / 共7页
亲,该文档总共7页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《C程序设计教案252课时——函数的递归调用.docx》由会员分享,可在线阅读,更多相关《C程序设计教案252课时——函数的递归调用.docx(7页珍藏版)》请在第一文库网上搜索。

1、教案序号25周次授课形式新授授课章节名称函数的递归调用教学目的学会使用函数的递归调用教学重点学会使用函数的递归调用教学难点学会使用函数的递归调用使用教具机房课外作业课后体会授课主要内容 7.6函数的递归调用 在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。 C语言的特点之一就在于允许函数的递归调用。 7.6函数的递归调用intf(intx)(ity,z;z=f(y);return(2*z);) 7.6函数的递归调用例7.6有5个学生坐在一起 问第5个学生多少岁?他说比第4个学生大2岁 问第4个学生岁数,他说比第3个学生大2岁 问第3个学生,又说比第2个学生大2岁 问

2、第2个学生,说比第1个学生大2岁 最后问第1个学生,他说是10岁 请问第5个学生多大7.6函数的递归调用解题思路: 要求第5个年龄,就必须先知道第4个年龄 要求第4个年龄必须先知道第3个年龄 第3个年龄又取决于第2个年龄 第2个年龄取决于第1个年龄 每个学生年龄都比其前1个学生的年龄大27.6函数的递归调用解题思路:age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(5)=age(4)+2age(5)=age(4)+2#inc1udeintmain()intage(intn);Printf(NO.5,

3、age:%dn”,age);return0;)intage(intn)intc;if(n=1)c=10;e1sec=age(n-1)+2;return(c);)age(5)输出age(5)例7.7用递归方法求n!。A解题思路:求n!可以用递推方法:即从1开始,乘2,再乘3一直乘到n。递推法的特点是从一个已知的事实(如1!=1)出发,按一定规律推出下一个事实(如2!=1!*2),再从这个新的已知的事实出发,再向下推出一个新的事实(3!=3*2!)。n!=n*(n-1)!.例7.7用递归方法求n!。A解题思路:求n!也可以用递归方法,即5!等于4!5,而4!=3!41!=1 可用下面的递归公式表示

4、:#inc1udeintmain()intfac(intn);intn;inty;printf(,inputanintegernumber:*);SCaIIf(”d”,&n);y=fac(n);printfC,%d!=%dn,n,y);return0;intfac(intn)(intf;if(n0)printf(,n由上面的分析可知:将n个盘子从A座移到C座可以分解为以下3个步骤:(1)将A上n-1个盘借助C座先移到B座上(2)把A座上剩下的一个盘移到C座上(3)将n-1个盘从B座借助于A座移到C座上可以将第步和第步表示为: 将“one”座上n-1个盘移到“two”座(借助“three”座 在

5、第(1)步和第(3)步中,one、two、three和A、B、C的对应关系不同。 对第(1)步,对应关系是One对应A,two对应B,three对应C。 对第步,对应关系是One对应B,two对应C,three对应A。把上面3个步骤分成两类操作:(1)将n1个盘从一个座移到另一个座上(n1)这就是大和尚让小和尚做的工作,它是一个递归的过程,即和尚将任务层层下放,直到第64个和尚为止。(2)将1个盘子从一个座上移到另一座上。这是大和尚自己做的工作。编写程序。 用hanoi函数实现第1类操作(即模拟小和尚的任务) 用move函数实现第2类操作(模拟大和尚自己移盘) 函数调用hanoi(n,one,

6、two.three)表示将n个盘子从one”座移到“three”座的过程(借助“two”座) 函数调用move(x,y)表示将1个盘子从X座移到y座的过程。X和y是代表A、B、C座之一,根据每次不同情况分别取A、B、C代入#inc1udeintmain()voidhanoi(intn,charone,chartwo,charthree);intm;printf(wthenumberofdiskes:*);scanf(,%d,m);printf(,move%ddiskes:nn,m);hanoi(m,A*,B,*C,);voidhanoi(intn,charone,chartwo,charthr

7、ee)voidmove(charx,chary);if(n=1)move(one,three);e1sehanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);)voidmove(charx,chary)(printf(n%c-%cn,x,y);7.7数组作为函数参数7.7.1 数组元素作函数实参7.7.2 数组名作函数参数7.7.3 多维数组名作函数参数 7.7.1数组元素作函数实参例7.9输入10个数,要求输出其中值最大的元素和该数是第几个数。 771数组元素作函数实参解题思路:定义数组a,用来存放10个数设计函数

8、InaX,用来求两个数中的大者在主函数中定义变量m,初值为a0,每次调用max函数后的返回值存放在m中用“打擂台”算法,依次将数组元素a1到a9与In比较,最后得到的m值就是10个数中的最大者#inc1udeintnain()intmax(intx,ity);inta10,m,n,i;Printf(TOintegernumbers:nn);for(i=0;i10;i+)scanf(%d,a1i);printf(,nn);for(i=1,m=a0J,n=0;im)m=max(m,aij);n=i;)Printf(1argestnumberis%dn,m);printf(tt%dthnumber.

9、nw,n+1); 772数组名作函数参数 除了可以用数组元素作为函数参数外,还可以用数组名作函数参数(包括实参和形参)用数组元素作实参时,向形参变量传递的是数组元素的值用数组名作函数实参时,向形参传递的是数组首元素的地址 772数组名作函数参数例7.10有一个一维数组SCore,内放10个学生成绩,求平均成绩。解题思路: 用函数average求平均成绩,用数组名作为函数实参,形参也用数组名 在average函数中引用各数组元素,求平均成绩并返回main函数#inc1udeintnain()f1oataverage(f1oatarray10J);f1oatscore10J,aver;inti;p

10、rintf(inputIOscoresAn);for(i=0;i10;i+)scanf(*%f*,&scorei);printf(nn);aver=average(score);printf(,%5.2n,aver);return0;f1oataverage(f1oatarray10)iti;f1oataver,sum=arrayO;for(i=1;i10;i+)sum=sum+arrayi;aver=sum10;return(aver);例7.11有两个班级,分别有35名和30名学生,调用一个average函数,分别求这两个班的学生的平均成绩。解题思路: 需要解决怎样用同一个函数求两个不同长

11、度的数组的平均值的问题 定义average函数时不指定数组的长度,在形参表中增加一个整型变量i 从主函数把数组实际长度从实参传递给形参i 这个i用来在average函数中控制循环的次数 为简化,设两个班的学生数分别为5和10#inc1udeintnain()f1oataverage(f1oatarray,intn);f1oatSCOreH5=98.5,97,91.5,60,55;f1oatscore210J=67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5;printf(t4%6.2n,average(score1,5);printf(tt%6.2n,aver

12、age(score2,10);return0;f1oataverage(f1oatarray,intn)Mti;f1oataver,sum=array0;for(i=1;in;i+)sum=sum+array1i;aver=sumn;return(aver);f1oataverage(f1oatarray,intn)Mti;f1oataver,sum=array0;for(i=1;i解题思路:所谓选择法就是先将10个数中最小的数与a0对换;再将a1到a9中最小的数与a1对换每比较一轮,找出一个未经排序的数中最小的一个共比较9轮#inc1udeintnain()voidsort(intarray,intn);inta10J,i;printf(,enterarray:nM);for(i=0;i10;i+)scanf(,%d,a

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 应用文档 > 汇报材料

copyright@ 2008-2022 001doc.com网站版权所有   

经营许可证编号:宁ICP备2022001085号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有,必要时第一文库网拥有上传用户文档的转载和下载权。第一文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知第一文库网,我们立即给予删除!



客服