《NOI导刊基础算法(枚举、递推与递归)》-课件.ppt

《NOI导刊基础算法(枚举、递推与递归)》-课件.ppt

  1. 1、本文档共42页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * * * * * * * 递归的概念与基本思想 采用递归方法编写的问题解决程序具有结构清晰,可读性强等优点,且递归算法的设计比非递归算法的设计往往要容易一些,所以当问题本身是递归定义的,或者问题所涉及到的数据结构是递归定义的,或者是问题的解决方法是递归形式的时候,往往采用递归算法来解决。 递归的应用 解决搜索问题 处理递归定义或解决方法为递归方式的问题 实现分治思想 用于输出动态规划的中间过程 递归的应用(搜索树) 树结构是由递归定义的。因此,在解决与树有关的问题时,常常可以采用递归的方法。因为搜索产生的节点成树状结构,所以可以用递归方法解决。这类例子很多,如“N后”问题,哈密顿回路,图的可着色性等等。 递归的应用 例题:钢板分割问题。设有一块正方形的钢板,现需将它分成n个小正方形。例如,当: n=2 不可能有解。 n=3 不可能有解。 n=4 可分成4个小正方形钢板。 n=5 不可能有解。 n=6 即一个大的加五个小的。 n=7 即三个较大的加四个小的。 n=8 即一个大的加七个小的。 问题为任给n,求出分成n个小正方形的方法。 递归的应用 【分析】经过分析就可以得出: (1)按n=4的方法将1个小正方形分成4个,则增加了3个正方形。 (2)以n=6为基础,由(1)可以得出n=9,12,15,??????。 (3)以n=7为基础,由(1)可以得出n=10,13,16,??????。 (4)以n=8为基础,由(1)可以得出n=11,14,17,??????。 由此可以得出如下的递归算法: 递归的应用 procedure devide(i:integer); Begin if n8 then begin 分解成四小块; 对于其中一块devide(n-3) end else case n of 6: 按n=6分割; 7: 按n=7分割; 8: 按n=8分割; end; End; 递归的应用(实现分治思想) 不难发现,在各种时间复杂度为nlogn排序方法中,大都采用了递归的形式。因为无论是分治合并排序,还是堆排序、快速排序,都存在有分治的思想。只要分开处理,就可以采用递归。其实进行分治,也是一个建树的过程。 递归的应用(例题分析) 例题2:剔除多余括号 键盘输入一个含有括号的四则运算表达式,可能含有多余的括号,编程整理该表达式,去掉所有多余括号,原表达式中所有变量和运算符相对位置保持不变,并保持原表达式等价。 分析: 首先考虑人处理这个问题的方法,就是依靠符号来判断是否可以去括号。括号的前后,以及括号内的符号,都需要考虑。因此,可以按照人的处理方法,从最外层处理起,一层一层的去掉括号,这便是分治的思想。而由于每次分治的处理过程基本相同,用递归最为合适。 递归的应用(例题分析) 在递归过程中,对于正在处理的表达式s,如果s本身最外层就是多余括号,则去括号,并处理括号内的表达式(递归调用);否则,可沿该表达式中的最低级运算符p,将其拆为两个表达式,分别进行处理(递归调用),并获得左右两表达式中的最低级运算符c1,c2,通过与p的比较,确定是否应添加括号。 递归的终止条件为:s是变量。 递归的应用(例题分析) 例如,处理表达式‘((a+b)*f)-(i/j)’,过程如下: ‘((a+b)*f)-(i/j)’,‘-’ ? ‘((a+b)*f),’*’ ‘(i/j),’/’ ‘(a+b)*f),’*’ ‘i/j’,’/’ ‘(a+b)’,’+’ ‘f’,’ ‘ ‘i’,’ ‘ ‘j’,’ ‘ ? ‘a+b’,’+’ ‘a’,’ ‘ ‘b’,’ ‘ 最后得出结果:‘(a+b)*f-i/j’。 递归的应用(输出动态规划的中间过程) 动态规划对空间要求较高,若要保存中间过程用于输出,则可能要增加一倍的空间需求。此时,如果采用递归输出,就完全不需要浪费这宝贵的空间。 例题:最佳航线问题 你在加拿大航空公司组织的一次竞赛中获奖,奖品是一张免费机票,可在加拿大旅

文档评论(0)

沙卡娜 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档