实验6+汉诺塔游戏的迭代实现讲解.ppt

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验6汉诺塔游戏的迭代实现讲解

第*页/共15页 软件综合项目开发训练 实验6 迭代 汉诺塔游戏 李伟键 weijianlee@126.com 递归 递归:函数f()直接调用自己,或通过另一函数g()间接调用自己。 f(){ | f(){ g(){ …… | …… …… f(); | g(); f(); …… | …… …… } | } } 使用递归函数的两个条件 一个大的问题可以逐步转化为一个或多个小的类似问题,直到简化为一个简单问题; 递归有明确的终止条件。 递归的使用 求解n的阶乘n! n! = n×(n-1)×(n-2)×...×2×1 = n×(n-1)! int factorial ( int num ){ if ( num = 1 ) return 1; else return num * factorial( num -1 ); } void main(){ int sum = factorial(10); printf(10!等于%d, sum); } 迭代(循环) 迭代算法是对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。 使用循环结构体:for / while / do while…… 迭代的三个条件: 确定迭代变量; 建立迭代关系式; 对迭代过程进行控制:迭代次数,或者条件测试 迭代的使用 求解n的阶乘n! n! = n×(n-1)×(n-2)×...×2×1 = n×(n-1)! void main(){ int i, sum = 1; for ( i =n; i=1; i--){ sum = i * sum; } printf(n!等于%d, sum); } 递归vs迭代 递归程序更直接,更好理解,编程更简单; 递归程序的实现比迭代程序的实现需耗费更多的时间和空间。 因此,在具体实现的实现,尽可能把递归程序转化为迭代程序。 并非所有的递归程序都有对应的迭代程序; - 尾递归:递归作为最后一条语句,并且仅此一个递归调用。可以直接转化为迭代(如求n!的递归); - 非尾递归,无法直接转化,需要通过使用堆栈,来实现递归。 递归转化为迭代 把递归算法转化为非递归算法有如下三种基本方法: (1)通过分析,跳过分解过程,直接用循环结构的算法实现求值过程; (2)递归为尾递归,直接转化为迭代算法; (3)自己用栈模拟系统的运行时栈,通过分析只保存必须保存的信息,从而用非递归算法替代递归算法。 汉诺塔问题 有三根杆子(命名为A、B和C)。A杆上N(N1)个穿孔的圆盘,盘的尺寸由下到上依次变小。 要求按照如下规则将A杆上的所有圆盘移至C杆上: 每次只能移动一个圆盘; 大盘不能叠在小盘下面。 汉诺塔游戏 基本思路 移动n个圆盘的基本思路 将n-1个盘子从A杆移动B杆,在此过程中可使用C杆作为临时存放区; 将最后一个盘子(最大)从A杆移动C杆; 将n-1个盘子从B杆移动C杆,在此过程中可使用A杆作为临时存放区。 移动n-1个圆盘的思路同移动n个圆盘。 当n=1时,过程结束。 迭代思路(1/2) 1.recursion_hano(n-1,A,C,B); // 将 上 n-1 个圆盘移动到 B上 2.moveAC(n, A,C); //将最大的圆盘移动到 C上 3.recursion_hano(n-1,B,A,C); //将B上的圆盘移动到C上 先把1移完,再移2,最后再移3。 移1时,又是:先把1移完,再移2,最后再移3。 …… 可以看出,如上符合一个堆栈的特点:后入先出。 入栈顺序:3,2,1。接着出栈,1。处理1:入栈3,2,1… 迭代思路(2/2) 使用一个堆栈来存放函数参数,对这些函数参数,依次调用函数recursion_hano或者moveAC来处理: 如果是recursion_hano函数,依次把3.recursion_hano(n-1,B,A,C) 、2.moveAC(n, A,C)和1.recursion_hano(n-1,A,C,B)入堆栈 如果是moveAC函数,直接移动,也就是屏幕打印出移动某圆盘,从x柱到y柱。 函数参数要存放入堆栈,需要为ElemType声明一个结构体,结构体内放入所需的各种参数(n,num, A,B,C): n:要移动的盘子最大编号 num:移动盘子个数 - 如果num为1,则为moveAC - 如果num=n,则为recursion_hano A,B,C:移动的柱子编号 A-C,B为中转 编码思路 初始化堆栈S 依次把(n-1, n-1

文档评论(0)

000 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档