数据结构(严蔚敏)Chapter6 Recursion.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Data Structures and Algorithms with Java Chapter6 Recursion 本章掌握内容 掌握内容 递归的概念 递归的实例和应用:三角数字、阶乘、递归的二分查找、汉诺塔问题,归并排序等问题 递归的优缺点,递归的方法转换为基于栈的非递归方法 本章掌握重点 三角数字 阶乘 变位数 递归的二分查找 递归的概念 递归是一种方法(函数)调用自己的编程技术。 Recursion is a programming technique in which a method (function) calls itself ① 三角数字 Triangular Numbers 1, 3, 6, 10, 15, 21, … The n-th term in the series is obtained by adding n to the previous term. 使用递归查找第n项 THE triangle.java PROGRAM 递归方法的特征 尽管triangle()方法很短,但它拥有所有递归算法都具备的关键特性: 调用自己. 当调用自身的时候,目的是为了解决更小的问题. 存在某个足够简单的问题层次,在这一层算法不需要调用自己就可以直接解答,且返回结果. 在递归算法每次调用自身的过程中,参数变小,这反映了问题变小或变简单。当参数达到一定的最小值时,将会触发一个条件,此时方法不需要调用自身而可以返回 采用递归方法,只是从概念上简化了问题,而不是因为本质上它更有效率: 与一般处理(while循环)相比,递归需要调用方法,会有一些额外的开销。 控制必须从这个调用的位置转移到这个方法的开始处。除此之外,传给这个方法的参数以及这个方法返回的地址都要被压入到一个内部的栈里,为的是这个方法可以访问参数值和知道返回到哪里。 递归需要存储中间参数以及返回值。如果中间变量过多,将影响效率。 ② 阶乘 Factorials 阶乘在概念上和三角数字是类似的,只是用乘法取代了加法。 5!=5*4*3*2*1=120 ③ 变位字 Anagrams 你会怎样写一个程序来全排列单词呢? 假定这个词有n个字母, 全排列最右边的n-1个字母; 轮换所有的n个字母; 重复以上步骤n次。 The anagram.java Program ④递归的二分查找 A Recursive Binary Search 用最短的时间在有序数组中找到给定的数据项。方法是把数组从中间分成两半,然后看要查找的数据项在数组的哪一半,再次地折半,如此这样下去,find()方法如下: RECURSION REPLACES THE LOOP ⑤ 汉诺塔 The Towers of Hanoi 汉诺塔问题是由很多放置在三个塔座上的盘子组成的一个古老的难题。 在印度的某地流传着一个古老的神话,在一个偏僻的庙宇,僧侣们日夜不停的劳动,要把64个金制的盘子从三个镶嵌着钻石的塔中的一个搬到另外一个里。当他们完成这个任务的时候,世界就将灭亡了。这可能会使人感到某种恐慌,但是,如果知道这个难题中即使只是搬比64少得多的盘子也要花多么长的时间的话,这种恐慌就会消失了。 递归的算法 假定源塔为S,目标塔为D,中介塔为I,S上有n个盘子,算法如下: 从S上移动n-1个盘子的子树到塔座I上; 从塔S移动剩余的盘子(最大的盘子)到D上; 从塔座I移动子树到塔座D上 THE towers.java PROGRAM ⑥ 归并排序 Mergesort 冒泡、插入和选择排序需要O(N2)的时间,而归并排序需要O(N*logN)的时间。 Listing 6.5 The merge.java Program 通过归并进行排序 SORTING BY MERGING mergeSort.java程序 归并排序的效率 MERGESORT mergesort take O(N*logN) time. Number of Copies 比较的次数 比较的最大次数总是比正在被归并的数据项个数少一,并且比较的最少次数是正在被归并的数据项数目的一半。 ⑦ 消除递归 有一些算法趋向于用递归,另一些算法则不是。正如前面已经看到的那样,递归的triangle()和factorial()方法可以用一个简单的循环来实现,那样效率更高。但各种分治算法,比如归并排序的递归函数,能工作得非常好。 一个算法利用递归,从概念上容易理解,但是,实际应用中,证明递归的效率往往不太高。需要将递归转化为非递归算法,这种转换用到了栈。 ⑧ 一些递归的应用 求一个数的乘方 int power(x,y) { if(y==1) return x; else

文档评论(0)

1243595614 + 关注
实名认证
文档贡献者

文档有任何问题,请私信留言,会第一时间解决。

版权声明书
用户编号:7043023136000000

1亿VIP精品文档

相关文档