数据结构课件1-11全书讲第11讲算法设计与分析幻灯片.pptVIP

数据结构课件1-11全书讲第11讲算法设计与分析幻灯片.ppt

  1. 1、本文档共14页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第11讲 算法设计与分析 算法设计 通常求解一个问题可能会有多种算法可供选择,选择的主要标准是算法的正确性、可靠性、简单性和易理解性。其次是算法所需要的存储空间少和执行更快等因素。 递归算法 一个直接或间接地调用自身的算法称为递归算法,一个直接或间接地调用自身的函数称为递归函数。 在算法设计中,使用递归技术往往能使函数的定义和算法的描述简捷并且便于理解。 一般递归具有如下的形式: if (递归结束条件) { /*递归结束条件成立,结束递归调用 */ 递归结束部分; } else { /*递归结束条件不成立,继续进行递归调用 */ 递归调用部分; } 或 if (递归调用条件) { /* 递归调用条件成立,继续进行递归调用 */ 递归调用部分; } [else { /* 递归调用条件不成立,结束递归调用 */ 递归结束部分; }] 例:用递归求阶乘n!。 阶乘可用迭代表示如下: int Factorial(int n) // 操作结果: 用递归求阶乘n! { if (n 0) { // 递归条件成立 return n * Factorial( n - 1); // 递归调用 } else { // 递归条件不成立 return 1; // 递归结束 } } 例:Fibonacci数列递归算法。 无究数列:0, 1, 1, 2, 3, 5, 8, 13, …,称为Fibonacci数列,可以迭代定义为: int Fibonacci(int n) // 操作结果: 返回Fibonacci数列的第n项 { if (n == 0) { // 递归结束条件成立 return 0; // 终止递归调用 } else if (n == 1) { // 递归结束条件成立 return 1; // 终止递归调用 } else { // 递归结束条件不成立 return Fibonacci(n - 1) + Fibonacci(n - 2); // 递归调用 } } 分治算法 分治算法与软件设计的模块化方法类似。为了解决一个大的问题,将一个规模为n的问题分解为规模较小的子问题,这些子问题互相独立并且和原问题相同。分别解这些子问题,最后将将各个子问题的解合并得到原问题的解。 子问题通常与原问题相似,可以递归地使用分治策略来解决。 。 例:Hanoi塔问题 传说在古代印度的贝拿勒圣庙里,安装着三根插至黄铜板上的宝石针,印度主神梵天在其中一根针上从下到上由大到小的顺序放64片金圆盘,称为梵塔,然后要僧侣轮流值班把这些金圆盘移到另一根针上,移动时必须遵守如下规则: (1)每次只能移动一个盘片; (2)任何时候大盘片不能压在小盘片之上; (3)盘片只允许套在三根针中的某一根上。 这位印度主神号称如果这64片盘全部移到另一根针上时,世界在一声霹雳中毁灭,Hanoi塔问题又称“世界末日”问题。下图为3阶Hanoi塔的初始情况。 于n阶Hanoi塔问题Hanoi(n, a, b, c),当n=0时,没盘子可供移动,什么也不做;当n=1时,可直接将1号盘子从a轴移动到c轴上;当n=2时,可先将2号盘子移动到b轴,再将1号盘子移动到c轴,最后将2号盘子移动到c轴;对于一般n0的一般情况可采用如下分治策略进行移动 (1)将1至n-1号盘从 a 轴移动至 b 轴,可递归求解Hanoi(n-1, a, c, b); (2)将 n号盘从 a 轴移动至 c 轴; (3)将1至n-1号盘从b轴移动至c轴,可递归求解 Hanoi(n-1, b, a, c)。 void Hanoi(int n,char a,char b,char c) // 操作结果: 将a塔座上的直径由小到大,至上而下编辑为 // 1至n的n个盘子按规则移到塔座c上,塔座b可用作 // 辅助塔座 { if (n 0) { // 递归条件成立 Hanoi(n - 1, a, c, b); // 将a塔座上编号为1至 // n-1的圆盘移到b塔座,c作辅助塔座 cout 编号为 n 的盘子从 a 塔座移到 c 塔座 endl; // 将编号为n的圆盘从a塔座移到c塔座 Hanoi(n - 1, b, a, c); // 将b塔座上编号为1至 // n-1的圆盘移到c塔座,a作辅助塔座 } } 算法分析 递归函数包含递归结束

文档评论(0)

开心农场 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档