数据结构(严蔚敏)chapter6recu.ppt
《数据结构(严蔚敏)chapter6recu.ppt》由会员分享,可在线阅读,更多相关《数据结构(严蔚敏)chapter6recu.ppt(57页珍藏版)》请在三一办公上搜索。
1、Data Structures and Algorithms with Java,Chapter6 Recursion,本章掌握内容,掌握内容递归的概念递归的实例和应用:三角数字、阶乘、递归的二分查找、汉诺塔问题,归并排序等问题递归的优缺点,递归的方法转换为基于栈的非递归方法,本章掌握重点,三角数字阶乘变位数递归的二分查找,汉诺塔 归并排序 消除递归 一些有趣的递归应用,递归的概念递归是一种方法(函数)调用自己的编程技术。Recursion is a programming technique in which a method(function)calls itself,三角数字 Trian
2、gular Numbers,1,3,6,10,15,21,The n-th term in the series is obtained by adding n to the previous term.,通常想到的解决方案,查找第n项,依次递减n,直至其减小到0,退出循环,使用递归查找第n项,The value of the nth term can be thought of as the sum of only two things,instead of a whole series.,1.The first(tallest)column,which has the value n.2.
3、The sum of all the remaining columns.,If we knew about a method that found the sum of all the remaining columns,then we could write our triangle()method,sumAllColumns方法所做的事情与triangle方法一致,The condition that leads to a recursive method returning without making another recursive call is referred to as
4、the base case.基值情况每个递归过程都有一个基值(终止)条件,以防止无限地递归下去,以及由此引发的程序崩溃,THE triangle.java PROGRAM,main()方法提示用户输入一个n值,调用triangle()方法,并且显示返回的结果。Triangle()方法反复地调用自身来做所有的工作。某个例子的输出结果:Enter a number:1000 Triangle=500500,递归方法的特征,尽管triangle()方法很短,但它拥有所有递归算法都具备的关键特性:调用自己.当调用自身的时候,目的是为了解决更小的问题.存在某个足够简单的问题层次,在这一层算法不需要调用自
5、己就可以直接解答,且返回结果.在递归算法每次调用自身的过程中,参数变小,这反映了问题变小或变简单。当参数达到一定的最小值时,将会触发一个条件,此时方法不需要调用自身而可以返回,采用递归方法,只是从概念上简化了问题,而不是因为本质上它更有效率:与一般处理(while循环)相比,递归需要调用方法,会有一些额外的开销。控制必须从这个调用的位置转移到这个方法的开始处。除此之外,传给这个方法的参数以及这个方法返回的地址都要被压入到一个内部的栈里,为的是这个方法可以访问参数值和知道返回到哪里。递归需要存储中间参数以及返回值。如果中间变量过多,将影响效率。,递归方法的效率,递归就是程序设计中的数学归纳法。数
6、学归纳法是一种通过自身的语汇定义某事物自己的方法。(语汇也被用于描述证明原理的相关方法)。使用数学归纳法,可以用数学的方法定义三角数字:,数学归纳法,阶乘 Factorials,阶乘在概念上和三角数字是类似的,只是用乘法取代了加法。5!=5*4*3*2*1=120,变位字 Anagrams,排列是指按照一定的顺序安排事物。假设想要列出一个指定单词的所有变位字,也就是列出该词的全排列。这个操作是变位一个单词或全排列一个单词。比如全排列cat,会产生:,试着自己手动全排列一个单词。所有字母都不同,全排列单词的数量?若同一字母出现多次,单词数就会少一些,你会怎样写一个程序来全排列单词呢?假定这个词有
7、n个字母,全排列最右边的n-1个字母;轮换所有的n个字母;重复以上步骤n次。,轮换单词意味着所有的字母向左移一位,但最左边的字母例外,它“转换”至最右边字母的右边。,全排列单词 cat,如何全排列最右边的n-1个字母?通过调用自己,void doAnagram(int nCount,int n,int*val)if(1=n)/输出 else/分配一个临时数组temp和val保存数据一致/依次取出temp的一个数据,/进入递归 doAnagram(nCount,n-1,temp);,The anagram.java Program,递归的二分查找 A Recursive Binary Searc
8、h,用最短的时间在有序数组中找到给定的数据项。方法是把数组从中间分成两半,然后看要查找的数据项在数组的哪一半,再次地折半,如此这样下去,find()方法如下:,RECURSION REPLACES THE LOOP,汉诺塔 The Towers of Hanoi,汉诺塔问题是由很多放置在三个塔座上的盘子组成的一个古老的难题。,问题定义:所有盘子的直径是不同的,并且盘子中央都有一个洞以使他们刚好放在塔座上。所有的盘子刚开始都放在塔座A上。这个难题的目标是将所有的盘子都从塔座A移动到塔座C上。每一次只可以移动一个盘子,并且任何一个盘子都不可以放在比自己小的盘子之上。,在印度的某地流传着一个古老的神
9、话,在一个偏僻的庙宇,僧侣们日夜不停的劳动,要把64个金制的盘子从三个镶嵌着钻石的塔中的一个搬到另外一个里。当他们完成这个任务的时候,世界就将灭亡了。这可能会使人感到某种恐慌,但是,如果知道这个难题中即使只是搬比64少得多的盘子也要花多么长的时间的话,这种恐慌就会消失了。,以少量的盘子为例,手动解决这个难题,看看有什么规律:在塔座A上盘子初始的树形排列成为一棵树。Applet演示过程中,会发现,出现这样的较小的树形堆是问题解决的关键。这些所含盘子数小于盘子总数的较小的树称为子树。举例来说,如果要移动四个盘子,会发现中间的一个状态是有3个盘子的子树在塔座B上,如下图。,需要补充的是,当手动解决这
10、个难题的时候,有一个经验法则,可以提供帮助。如果试图移动的子树包含有奇数个盘子,开始时直接把最顶端的盘子移动到想要的把这颗子树移动到的那个塔座上。如果试图要移动一颗含有偶数个盘子的子树,那么开始时要把最顶端的盘子移动到中介塔座上。如盘子总数为1,2或3,递归的算法,假定源塔为S,目标塔为D,中介塔为I,S上有n个盘子,算法如下:从S上移动n-1个盘子的子树到塔座I上;从塔S移动剩余的盘子(最大的盘子)到D上;从塔座I移动子树到塔座D上,当然,这个方法没有解决如何把包括盘子1,2和3的子树移动到塔座B上的问题,因为不能一次性的移动一棵子树;每次只能移动一个盘子。移动3个盘子的子树不是那么容易的,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 严蔚敏 chapter6recu
链接地址:https://www.31ppt.com/p-4980286.html