- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
内蒙古机电职业技术学院 《C语言程序设计》教案
PAGE
PAGE 1
内蒙古机电职业技术学院
教 案 首 页
课程:c语言程序设计 授课顺次:7 学时:2 班级:计信、自动化 日期: 第 节
课
题
4.3递归调用
目的要求
让学生掌握递归的概念
2、让学生掌握递归调用
重点难点
1、C语言的直接递归调用
教学过程
后附
教学手段
教学方法:讲授、演示
教学媒体:多媒体教学网
课后分析
以讲述理论知识为主,多举实例。
4.3 递归调用
递归:问题的求解归为更简单问题的求解(但不能直接求得)
递推:从一个已知事实出发,按一定规律推出下一事实,再以此为新事实,推出下一个事实。函数调用函数本身,称为函数的递归调用。
函数直接调用本身,称直接递归。
函数调用其它函数,其它函数又调用了本函数,称为间接递归。
递归调用形式如下:
(1) 直接递归
void a( )
{ ...…
a ( ); / * 自己调用自己, 直接递归 */
..…
}(2) 间接递归
void a( )
{ ...…
b ( ); / * 调用函数b *
...…
}
void b( )
{
a ( ); /* 调用函数a, 间接递归 */
..
}
例4.8 用递归算法计算n!
讨论:我们曾用循环的方法实现了n!计算,现在采用递归的方法计算。n!本身就是以递归的形式定义的:
n= n * (n-1)! n0
编程:
if (初始条件) 表达式;
else 递推表达式;
#include
unsigned long fac(unsigned int n)
{ unsigned long f ;
if (n==0) f=1; /*递归结束条件*/
else f = n * fac(n-1); /*直接递归调用*/
return f;
}
main( )
{ unsigned long y;
unsigned int n;
scanf(“%u”, n);
y = fac(n);
printf(“%u!=%lu”, n, y);
}
分析:当程序输入3时
例4.9 写递归函数求mn,并在主函数中键盘输入m,n,调用函数求mn的值
main()
{int m,n;
printf(Input m,n:);
scanf(%d,%d,m,n);
printf(%3d^%-d=%-d\n,m,n,power(m,n));
}
power(int x,int y)
{int p;
if (y==0) p=1;
else p=x*power(x,y-1);
return p;
}
例4.10 汉诺塔游戏
用递归算法来做汉诺塔游戏的程序是很有趣的,可以使复杂的过程变得意想不到的简单。汉诺塔(Tower of Hanoi)游戏据说来源于布拉玛神庙。 底座上有三根金刚石的针,第一根针上放着从大到小64个金片。游戏的目标是把所有金片从第一根针移到第三根针上,第二根针作为中间过渡。每次只能移动一个金片,并且大的金片不能压在小的金片上面。该游戏的结束就标志着“世界末日”的到来。
游戏中金片移动是一个很繁琐的过程。通过计算,对于64个金片至少需要移动 264 – 1 = 1.8×1019 次 。
对于把n(n1)个金片从第一根针a上移到第三根针c的问题可以分解成如下步骤:
(1) 将n-1个金片从a经过c 移动到b。
(2) 将第n个金片移动到c。
(3) 再将n-1个盘子从b经过a移动到c。
void hanoi(int n, int a, int b, int c)
{ if (n==0) return; /* 0个金片不处理 */
if (n==1)
printf(%d -%d\n,a,c); /* n=1时, 直接将金片从a移动到c */
else
{ hanoi(n-1,a,c,b); /* 先将n-1个金片从a经过c 移动到b */
printf(%d -%d\n,a,c); /* 将第n个金片从a移动到c */
hanoi(n-1,b,a,c); /* 再将n-1个金片从b经过a移动到c */
}
} 主函数如下:
#include
main( )
{ int n;
printf(Input n:);
scanf(%d,n);
hanoi(n,1,2,3);/*n个金片从第一根针经过第二根针移动到第三根针上*/ }
您可能关注的文档
- 南阳医学高等专科学校耗材采购项目.doc
- 内部文献注意保存.doc
- 内蒙古自治区.doc
- 拟征求意见食品添加剂名单.doc
- 宁夏大学学生工作简报.doc
- 宁夏精神文明建设.doc
- 牛顿第二定律教学设计.doc
- 农产品检验实验.doc
- 批准检测检验能力范围.doc
- 皮肤类型我先知答案.doc
- 年产3000吨医药级氨基酸衍生物系列产品项目可行性研究报告写作模板-申批立项.doc
- 100MW400MWh全钒液流储能电站项目可行性研究报告模板-立项备案.doc
- 饲草深加工及产业链开发项目可行性研究报告写作模板-拿地备案.doc
- 年产8万箱爆竹生产线改建项目可行性研究报告写作模板-拿地备案.doc
- 农作物秸秆综合利用项目可行性研究报告写作模板-拿地申报.doc
- 新建2万吨污水处理设施及配套管网建设项目可行性研究报告写作模板-拿地备案.doc
- 年产100万套水泵叶轮叶罩及汽车排气管生产加工项目可行性研究报告写作模板-申批立项.doc
- 3000吨2-氯-5-氯甲基噻唑、10000吨过氧化系列产品项目可行性研究报告写作模板-申批备案.doc
- 100MW400MWh锌铁液流电池新型储能示范项目可行性研究报告写作模板-备案审批.doc
- 年产40万吨干混砂浆项目可行性研究报告写作模板-申批立项.doc
文档评论(0)