- 1、本文档共70页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3.1 循环与递归 设计算法重复处理大量数据的思路:以不变应万变; 两种思路:循环、递归。 1 循环设计要点 循环控制-熟悉; 设计要点: 注意算法的效率 “自顶向下”的设计方法 由具体到抽象设计循环结构 1 循环设计要点-例1(注意算法效率) 例1 求级数 求:1/1!-1/3!+1/5!-1/7!+…+(-1)n+1/(2n-1)! 1 循环设计要点-例1 算法分析: 以上算法是二重循环来完成 ,但算法的效率却太低O(n2)。 1 循环设计要点-例2(自顶向下的设计方法) 1 循环设计要点-例2 核心算法设计 for(i=0;in;i=i+1){ 判断i是否是完数; if是“完数”则按规则输出; } 1 循环设计要点-例2 考虑到要按格式输出结果,应该开辟数组存储数据i的所有因子,并记录其因子的个数,因此算法细化如下: 1 循环设计要点-例3(从具体到抽象设计循环) 对于不太熟悉的问题,其“不变”不易抽象; 1 循环设计要点-例3 1 循环设计要点-例3 用斜行、列描述新的循环方向。 1 循环设计要点-例3 2 递归设计思路-例4 程序结构化设计的三种基本结构,顺序、选择、循环是不是必须的? 2 递归设计思路-例4 2 递归设计思路-例4 2 递归设计思路-例4 3 递归设计要点 递归的关键在于找出递归方程式和递归终止条件。 递归定义:使问题向边界条件转化的规则。递归定义必须能使问题越来越简单。 递归边界条件:也就是所描述问题的最简单情况,它本身不再使用递归的定义。 例1.1 欧几里德算法 gcd ( m, n ) = gcd ( n, m mod n ) 输入 正整数m和n 输出 m和n的最大公因子 如果n = 0, 计算停止返回m, m即为结果;否则继续2。 记r为m除以n的余数,即r=m mod n。 把n赋值给m,把r赋值给n,继续1。 伪代码如下(循环): Euclid(m, n) { while n 0 { r = m mod n; m = n; n = r; } } 3 递归设计要点-hanoi塔 Hanoi塔 hanoi河内[越南首都] 古代有一个梵塔,塔内有3个基座A、B、C, 开始时A基座上有64个盘子,盘子大小不等,大的在下,小的在上。 有一个老和尚想把这64个盘子从A座移到B座,但每次只允许移动一个盘子,且在移动过程中在3个基座上的盘子都始终保持大盘在下,小盘在上。 在移动过程中可以利用C基座做辅助。 请编程打印出移动过程 。 约定盘子自上而下的编号为1,2,3,……,n。 3 递归设计要点-hanoi塔 首先看一下2阶汉诺塔问题的解,不难理解以下移动过程: 初始状态为 A(1,2) B() C() 第一步后 A(2) B() C(1) 第二步后 A() B(2) C(1) 第三步后 A() B(1,2) C() 3 递归设计要点-hanoi塔 3 递归设计要点-hanoi塔 把n阶的汉诺塔问题的模块记作hanoi(n,a,b,c) a代表每一次移动的起始基座; b代表每一次移动的终点基座; c代表每一次移动的辅助基座 ; 则hanoi(n,a,c,b),表示把n个盘子从a搬到c,可以借助b; hanoi(5,c,a,b),表示把5个盘子从c搬到a,可以借助b。 3 递归设计要点-hanoi塔 hanoi(n,a,b,c) a:起始基座 b:终点基座 c:辅助基座 3 递归设计要点-hanoi塔 hanoi (int n,char a,char b,char c) /* a,b,c 初值为”A”,”B”,”C”*/ if(n0) { /*0阶的汉诺塔问题当作停止条件*/ hanoi(n-1,a,c,b); 输出 “ Move dish” ,n.”from pile”,a,” to”b); hanoi(n-1,c,b,a); } 4 非递归(循环)/递归比较-非递归hanoi塔 递归思路不适合人类使用:人脑的逆推深度是有限的,而计算机要比人脑深很多,论记忆的准确性,计算机要比人脑强很多。 4 非递归(循环)/递归比较-转化 4 非递归(循环)/递归比较 并不是每一门语言都支持/很好的支持递归; 有助于理解递归的本质; 有助于理解栈,树等数据结构; 两者各有利弊: 3.2 算法与基本数据结构 1 数据结构的选择很重要 计算机解决问题是
文档评论(0)