- 1、本文档共43页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法设计:首先,盘子的个数n是必须的一个输入参数,对n个盘子,我们可从上至下依次编号为1,2,…,n;其次,输入参数还需有3个柱子的代号,我们令3个柱子的参数名分别为fromPeg,auxPeg和toPeg;最后,汉诺塔问题的求解是一个处理过程,因此算法的输出是n个盘子从柱子fromPeg借助柱子auxPeg移动到柱子toPeg的移动步骤,我们设计每一步的移动为屏幕显示如下形式的信息: Move Disk i from Peg X to Peg Y 这样,汉诺塔问题的递归算法可设计如下: void towers(int n, char fromPeg, char toPeg, char auxPeg) { if(n==1) //递归出口 { printf(%s%c%s%c\n, move disk 1 from peg , fromPeg, to peg , toPeg); return; } //把n-1个圆盘从fromPeg借助toPeg移至auxPeg towers(n-1,fromPeg,auxPeg,toPeg);? //把圆盘n由fromPeg直接移至toPeg printf(%s%d%s%c%s%c\n, move disk , n, from peg , fromPeg, to peg , toPeg);? //把n-1个圆盘从auxPeg借助fromPeg移至toPeg towers(n-1,auxPeg,toPeg,fromPeg); } 测试主函数如下: #include stdio.h? void main(void) { Towers(4, A, C, B); } 程序运行的输出信息如下: Move Disk 1 from Peg A to Peg B Move Disk 2 from Peg A to Peg C Move Disk 1 from Peg B to Peg C Move Disk 3 from Peg A to Peg B Move Disk 1 from Peg C to Peg A Move Disk 2 from Peg C to Peg B Move Disk 1 from Peg A to Peg B Move Disk 4 from Peg A to Peg C Move Disk 1 from Peg B to Peg C Move Disk 2 from Peg B to Peg A Move Disk 1 from Peg C to Peg A Move Disk 3 from Peg B to Peg C Move Disk 1 from Peg A to Peg B Move Disk 2 from Peg A to Peg C Move Disk 1 from Peg B to Peg C 总结如下:递归算法的执行过程是不断地自调用,直到到达递归出口才结束自调用过程;到达递归出口后,递归算法开始按最后调用的过程最先返回的次序返回;返回到最外层的调用语句时递归算法执行过程结束。 6.4递归过程和运行时栈 对于非递归函数,调用函数在调用被调用函数前,系统要保存以下两类信息: (1)调用函数的返回地址; (2)调用函数的局部变量值。 当执行完被调用函数,返回调用函数前,系统首先要恢复调用函数的局部变量值,然后返回调用函数的返回地址。 递归函数被调用时,系统要作的工作和非递归函数被调用时系统要作的工作在形式上类同,但保存信息的方法不同。 递归函数被调用时,系统需要一个运行时栈.系统的运行时栈也要保存上述两类信息。每一层递归调用所需保存的信息构成运行时栈的一个工作记录,在每进入下一层递归调用时,系统就建立一个新的工作记录,并把这个工作记录进栈成为运行时栈新的栈顶;每返回一层递归调用,就退栈一个工作记录。因为栈顶的工作记录必定是当前正在运行的递归函数的工作记录,所以栈顶的工作记录也称为活动记录。 6.5递归算法的效率分析 斐波那契数列Fib(n)的递推定义是: 求第n项斐波那契数列的递归函数如下: long Fib(int n) { if(n == 0 || n == 1) return n; //递归出口 else return Fib(n-1) + Fib(n
您可能关注的文档
- 车用二甲醚橡胶密封材料相容性研究课件.ppt
- 车辆与动力工程系课件.ppt
- 转型国家的经济与政治经济制度的转型一、经课件.ppt
- 软件项目管理- Software- Project- Management课件.ppt
- 轻化工程323寝室邱-军许超黄国强-熊-宏李大威-孔卫刚课件.ppt
- 辽宁师范大学计算机与信息技术学院课件.ppt
- 过渡元素的一般定义及其分类d轨道的特征和过渡元素的价电课件.ppt
- 运动系统检查- Musculoskeletal- Examination课件.ppt
- 运动鞋营销培训课件.ppt
- 运用汉字学知识-提高识字教学效率课件.ppt
- 《智能化家电生产设备维护与故障预测模型构建研究》教学研究课题报告.docx
- 高中物理实验数据采集与分析软件开发教学研究课题报告.docx
- 小学特殊儿童社会融入教育中家长培训策略探讨教学研究课题报告.docx
- 初中历史情感态度培养在作业中的渗透研究教学研究课题报告.docx
- 《基于物联网的植物工厂环境控制策略对油菜生长性能的优化研究》教学研究课题报告.docx
- 《PCI术后患者心脏康复治疗依从性中的护理满意度与依从性关系研究》教学研究课题报告.docx
- 高中政治时事评论写作对提升学生思辨能力与公民意识的作用教学研究课题报告.docx
- 《农村新型经营主体融资困境的微观机制分析:基于金融产品创新的视角》教学研究课题报告.docx
- 第一单元第2课 互联网的软件与硬件 教学设计 2024—2025学年西交大版(2024)初中信息技术七年级上册.docx
- 2025淘宝商城代运营服务协议书.docx
文档评论(0)