




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章递归算法2024/11/91主要内容● 递归算法● 递归的复杂度● 问题与子问题● 递归与迭代● 多重递归● 经典递归● 优化递归递归算法是非常最重的算法,是很多算法的基础算法。递归算法不仅能使得代码优美简练,容易理解解决问题的思路或发现数据的内部的逻辑规律,而且具有很好的可读性。和排序算法不同,许多经典的排序算法已经是玲珑剔透、日臻完善,在许多应用中只要选择一种排序算法直接使用即可(见第4章和第12章),而对于递归算法,真正理解递归算法内部运作机制的细节、才能真对实际问题正确的使用递归算法或写出正确的递归算法。3.1递归算法递归算法是指一个方法在执行过程中又调用了自身、形成了递归调用,这样的方法被称为递归方法或递归算法。2024/11/92
2024/11/933.1递归算法递归过程中的压栈、弹栈方法f递归过程是,第k次调用f需要等待第k+1次调用f结束执行过程后才能结束执行过程。那么第R(n)次(最后一次)调用f结束执行过程后,就会依次使得第k次调用结束执行过程。方法被调用时,方法的(入口)地址会被压入栈(栈是一种先进后出的结构)中,称为压栈操作,同时方法的局部变量被分配内存空间。
……调用调用调用调用调用结束
结束
结束
结束结束
图3.1递归执行过程第1次调用第R(n)次调用2024/11/943.1递归算法递归过程中的压栈、弹栈方法调用结束,会进行弹栈,称为弹栈操作,同时释放方法的局部变量所占的内存。递归过程的压栈操作可以让栈的长度不断增加,而弹栈操作会让栈的长度变小,最终使栈的长度为0。…………
第1次弹栈第m次弹栈第k次弹栈第1次压栈第m次压栈第k次压栈2024/11/953.1递归算法时间复杂度方法调用结束,会进行弹栈,称为弹栈操作,同时释放方法的局部变量所占的内存。要针对具体的递归方法,来计算该递归方法的时间复杂度。递归方法是一个递归过程,从递归开始到递归结束,方法被调的总数R(n)是依赖于一个正整数n的函数。那么递归方法中基本操作被执行的总数T(n)就依赖递归的总数R(n)和每次递归时基本操作被执行的总数。2024/11/963.1递归算法空间复杂度方法调用结束,会进行弹栈,称为弹栈操作,同时释放方法的局部变量所占的内存。递归会让栈的长度不断发生变化,如果栈的长度较大可能导致栈溢出,使得进程(运行的程序)被操作系统终止。递归过程的压栈操作增加栈的长度、弹栈操作减小栈的长度。递归过程中可能交替地进行压栈操作和弹栈操作,直至栈的长度为0(见例子2)。计算出递归过程中,某一时刻(某一次递归)栈出现的最大长度和每次递归中方法的局部变量所占的内存空间,即计算出栈最大长度以及局部变量所占的全部内存空间和所依赖的正整数的关系,才可以知道空间复杂度。2024/11/973.2线性递归与非线性递归●线性递归线性递归是指,每次递归时,方法调用自身一次。
如果我们忘记了今天是星期几,就需要知道昨天是星期几,如此这般地向前(过去)翻日历(相当于递归里的压栈,导致栈的长度在增加),等到能翻到某个日历页上显示了星期几,就结束翻阅日历(相当于结束压栈),然后再一页一页的撕掉日历(相当于弹栈),日历上神奇地出现了星期数,即方法依次计算出自己的返回值。Week.java例子1Example3_1.java2024/11/983.2线性递归与非线性递归●线性递归递归方法f(intn)的递归的总次数:R(n)=n,而每次递归的基本操作只有2个基本操作,因此时间复杂度是O(n)。向下方向的弧箭头表示方法被调用,向上方向的直箭头表示方法调用结束。例子1压栈操作过程中得到的栈的最大长度是R(n)=n,空间复杂度是O(n)。2024/11/993.2线性递归与非线性递归●非线性递非线性递归是指,每次递归时方法,调用自身2次或2次以上。
Fibonacci.java例子2Example3_2.java2024/11/9103.2线性递归与非线性递归●非线性递例子2递归过程中,每次递归时方法调用自身2次,使得每次递归出现了2个递归“分支”,然后选择一个分支,继续递归,直到该分支递归结束,再沿着下一分支继续递归,当2个分支都递归结束,递归过程才结束,而且递归过程交替地进行压栈和弹栈操作,直至栈的长度为0。
2024/11/9113.3问题与子问题将规模大的问题,使用递归算法逐步分解成规模小的问题,最终解决规模大的问题。一个问题的子问题就是数据规模比此问题的规模更小的问题。当一个问题,可以分解成许多子问题时就可以考虑用递归算法来解决这个问题。2024/11/9123.3问题与子问题
SumMulti.java例子3Example3_3.java2024/11/9133.3问题与子问题
Reverse.java例子4Example3_4.javaMaxInArray.java2024/11/9143.4递归与迭代递归的思想是根据上一次操作的结果,确定当前操作的结果。迭代的思想是,根据当前操作的结果,确定下一次操作的结果。对于解决相同的问题,递归代码简练,容易理解解决问题的思路或发现数据的内部的逻辑规律,具有很好的可读性。由于迭代不涉及方法的递归调用,所以,通常情况下递归算法的空间复杂度会大于迭代的复杂度,当递归过程的递归总数比较大时,会导致栈溢出。2024/11/9153.4递归与迭代例子5中ComputePI类中的recursionMethod(intn)方法和iterationMethod(intn)都是通过计算级数的近似值返回圆周率的近似值,recursionMethod(intn)使用的是递归,iterationMethod(intn)使用的是迭代。ComputePI.java例子5Example3_5.java2024/11/9163.4递归与迭代
SearchNumber.java例子6Example3_6.java
2024/11/9173.4递归与迭代Euclidean.java例子7Example3_7.java
2024/11/9183.5多重递归所谓多重递归,是指一个递归方法调用另一个或多个递归方法,称该递归方法多重递归方法。
不要求输出含有偶数多个6的数。
2024/11/9193.5多重递归
2024/11/9203.6经典递归选择三个经典的递归:杨辉三角形、老鼠走迷宫和汉诺塔,进一步体会递归算法不仅能使得代码优美简练,容易理解解决问题的思路或发现数据的内部的逻辑规律,而且具有很好的可读性。特别是汉诺塔递归,通过其递归算法,洞悉其数据规律,给出相应的迭代算法。经典的递归:杨辉三角形,老鼠走迷宫,汉诺塔2024/11/9213.6经典递归杨辉三角
最早出现于中国南宋数学家杨辉1261年所著的《详解九章算法》中。法国数学家帕斯卡(Pascal)在1654年发现该三角形,所以又称帕斯卡三角形。
2024/11/9223.6经典递归杨辉三角最早出现于中国南宋数学家杨辉1261年所著的《详解九章算法》中。法国数学家帕斯卡(Pascal)在1654年发现该三角形,所以又称帕斯卡三角形。
2024/11/9233.6经典递归PascalTriangle.java例子9Example3_9.java杨辉三角
YanhuiTriangle.java
2024/11/9243.6经典递归老鼠走迷宫老鼠首先向东走,如果走到出口结束递归,否则向南…向西…向北。
2024/11/9253.6经典递归老鼠走迷宫例子10的主类Example3_10使用move(int[][]a,inti,intj)方法走迷宫。其中,用int型二维数组模拟迷宫,二维数组元素值是1表示墙,0表示路,2表示出口。老鼠走过迷宫后,输出老鼠走过的路时,用☆表示老鼠走过的路,■表示墙,★表示出口,□表示老鼠未走过的路。Mouse.java例子10Example3_10.java2024/11/9263.6经典递归汉诺塔(递归算法)汉诺塔(HanoiTower)问题是来源于印度的一个古老问题。有名字为A,B,C的三个塔,A塔上有从小到大64个盘子,每次搬运一个盘子,最后要把64个盘子搬运到C塔。在搬运盘子的过程中,可以把盘子暂时放在3个塔中的任何一个上,但不允许大盘放在小盘上面。3个盘子的汉诺塔
2024/11/9273.6经典递归汉诺塔(递归算法)3个盘子的汉诺塔
HannoiTower.java例子11Example3_11.java2024/11/9283.6经典递归汉诺塔(迭代算法)
这些规律是通过研究汉诺塔的递归算法发现的。就像本章一开始说的,递归可以发现数据的内部的逻辑规律。2024/11/9293.6经典递归汉诺塔(迭代算法)
一个偶数通过不断地右位移可计算出尾部连续的0的个数,例如:8的二进制1000右位移3次,得到奇数,因此知道8的二进制尾部连续0的个数是3。这些规律是通过研究汉诺塔的递归算法发现的。就像本章一开始说的,递归可以发现数据的内部的逻辑规律。2024/11/9303.6经典递归汉诺塔(迭代算法)这些规律是通过研究汉诺塔的递归算法发现的。就像本章一开始说的,递归可以发现数据的内部的逻辑规律。
HanoiTowerIterator.java例子12ZeroCount.javaExample3_12.java2024/11/931计算Fibonacci序列的递归过程中需要将f(n-1)分支进行完毕,再进行f(n-2)分支。需要注意到的是,在进行f(n-1)分支递归时,会完成了f(n-2)分支递归,那么再进行f(n-2)分支就是一个重复的递归过程。简而言之,优化递归就是避免重复子递归。优化递归就是在每次递归开始前,首先到某个对象中,通常为散列表对象,也可以是数组,查找本次递归是否已经被实施完毕,即是否已经有了递归结果,如果散列表对象中已经有了本次递归的结果,就直接使用这个结果,不再浪费时间进行本次递归,否则就进行本次递归,并将递归结果保存到散列表对象。3.7优化递归2024/11/9323.7优化递归
OptimizeFibona
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业管理中的风险控制与应对
- 企业财务管理体系搭建与实施
- 中华传统乐舞文化的传承与创新
- 交通工程中的路基处理与加固技术
- 全球化背景下的国际贸易合作
- 中小企业SEO优化策略及实战技巧
- 肝功能衰竭的护理查房
- 互联网金融时代下的银行创新发展策略
- 产品设计的情感化与智能化融合探讨
- 花洒定制合同范本
- 酒店安全隐患排查奖惩制度
- 发生治疗错误的应急预案
- 废旧家电拆解与零件再制造工艺
- 农产品食品检验员(高级)职业技能鉴定考试题库
- 【MOOC】模拟电子电路实验-东南大学 中国大学慕课MOOC答案
- 2024年注册会计师考试税法科目试卷与参考答案
- 《大坝安全监测培训》课件
- 2024年全国中学生生物学联赛试题含答案
- 大学藻类课件教学课件
- 报关实务-教学课件 第一章 海关概念
- 防火门监控系统技术规格书
评论
0/150
提交评论