算法基本工具幻灯片.ppt
《算法基本工具幻灯片.ppt》由会员分享,可在线阅读,更多相关《算法基本工具幻灯片.ppt(70页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、算法基本工具算法基本工具1第1页,共70页,编辑于2022年,星期一3.1.1 循环与递归循环与递归n设计算法重复处理大量数据的思路:设计算法重复处理大量数据的思路:以不变应万变;以不变应万变;n两种思路:两种思路:循环、递归。循环、递归。n1循环设计要点循环设计要点q例例3.1求完数求完数q例例3.2打印数字图形打印数字图形q例例3.3求级数求级数n2递归设计思路递归设计思路(运行机制、复杂度分析运行机制、复杂度分析)q例例3.4累加求和累加求和n3递归设计要点递归设计要点q例例3.5hanoi塔塔n4非递归非递归(循环循环)/递归比较递归比较2第2页,共70页,编辑于2022年,星期一1
2、循环设计要点循环设计要点n循环控制循环控制-熟悉;熟悉;n设计要点:设计要点:q注意算法的效率注意算法的效率q“自顶向下自顶向下”的设计方法的设计方法 q由具体到抽象设计循环结构由具体到抽象设计循环结构3第3页,共70页,编辑于2022年,星期一1 循环设计要点循环设计要点-例例1(注意算法效率)注意算法效率)n例例1求级数求级数n求:求:1/1!-1/3!+1/5!-1/7!+(-1)n+1/(2n-1)!n问题分析:此问题中既有累加又有累乘,累加的对象是累乘问题分析:此问题中既有累加又有累乘,累加的对象是累乘的结果。的结果。数学模型数学模型1:Sn=Sn-1+(-1)n+1/(2n-1)!
3、算法设计算法设计1:直接利用题目中累加项通式,构造出循环体不变:直接利用题目中累加项通式,构造出循环体不变式为:式为:S=S+(-1)n+1/(2n-1)!需要用二重循环来完成算法。需要用二重循环来完成算法。n算法设计算法设计1:q外层循环求累加外层循环求累加S=S+A;q内层循环求累乘内层循环求累乘A=(-1)n+1/(2n-1)!。4第4页,共70页,编辑于2022年,星期一1 循环设计要点循环设计要点-例例1n算法分析:算法分析:n以上算法是二重循环来完成以上算法是二重循环来完成,但算法的效率却太低,但算法的效率却太低O(n2)。n数学模型数学模型2:Sn=Sn-1+(-1)n+1An;
4、An=An-1*1/(2*n-2)*(2*n-1)n其原因是,当前一次循环已求出其原因是,当前一次循环已求出7!,当这次要想求!,当这次要想求9!时,没!时,没必要再从必要再从1去累乘到去累乘到9,只需要充分利用前一次的结果,用,只需要充分利用前一次的结果,用7!*8*9即可得到即可得到9!,模型为!,模型为An=An-1*1/(2*n-2)*(2*n-1)。n算法分析:按照数学模型算法分析:按照数学模型2,只需一重循环就能解决问题,只需一重循环就能解决问题算法的时间复杂性为算法的时间复杂性为O(n)。5第5页,共70页,编辑于2022年,星期一1 循环设计要点循环设计要点-例例2(自顶向下的
5、设计方法)(自顶向下的设计方法)n例例2.编算法找出编算法找出1000以内所有完数。以内所有完数。n如:如:28的因子为的因子为1、2、4、7,14,而,而28=1+2+4+7+14。因此。因此28是是“完数完数”。编算法找出。编算法找出1000之内的所有完数,并按下面格之内的所有完数,并按下面格式输出其因子:式输出其因子:28itsfactorsare1,2,4,7,14。n问题分析:问题分析:n1、这里、这里不是要质因数不是要质因数,所以找到因数后也无需将其从数据中,所以找到因数后也无需将其从数据中“除除掉掉”。n2、每个因数只记一次每个因数只记一次,如,如8的因数为的因数为1,2,4而不
6、是而不是1,2,2,2,4。(注:本题限定因数不包括这个数本身注:本题限定因数不包括这个数本身)6第6页,共70页,编辑于2022年,星期一1 循环设计要点循环设计要点-例例2n核心算法设计核心算法设计qfor(i=0;in;i=i+1)判断判断i是否是完数是否是完数;if是是“完数完数”则按规则输出则按规则输出;自顶向下,逐步求精自顶向下,逐步求精n判断判断i是否是完数是否是完数qfor(j=2;ji;j=j+1)找找i的因子,并累加;的因子,并累加;if累加值等于累加值等于i,则,则i是完数;是完数;n判断判断i是否是完数是否是完数qs=1;for(j=2;ji;j=j+1)if(imod
7、j=0)s=s+j;if(s=i)i是是“完数完数”;判断是否是完数的方法是判断是否是完数的方法是“不变不变”,被判断的数是,被判断的数是“万变万变”。7第7页,共70页,编辑于2022年,星期一输出数据的方法是输出数据的方法是“不变不变”,被输出的数是,被输出的数是“万变万变”。1 循环设计要点循环设计要点-例例2n考虑到要按格式输出结果,应该开辟数组存储数据考虑到要按格式输出结果,应该开辟数组存储数据i的所有的所有因子,并记录其因子的个数,因此算法细化如下:因子,并记录其因子的个数,因此算法细化如下:qinta100,s=1,k=0;for(j=2;ji;j=j+1)if(imodj=0)
8、s=s+j;ak=j;k=k+1;if(s=i)print(s,“itsfactorsare:”,1);for(j=0;jk;j+)print(“,”,ak)8第8页,共70页,编辑于2022年,星期一1 循环设计要点循环设计要点-例例3(从具体到抽象设计循环)(从具体到抽象设计循环)n对于不太熟悉的问题,其对于不太熟悉的问题,其“不变不变”不易抽象;不易抽象;162107313118415141295n=5n例例3编写算法:根据参数编写算法:根据参数n打印具有下面规律的图形,如,当打印具有下面规律的图形,如,当n=4时,图形如下:时,图形如下:q1q52q863q109749第9页,共70页
9、,编辑于2022年,星期一1 循环设计要点循环设计要点-例例315286310974n问题分析:问题分析:q容易发现图形中数据排列的规律。容易发现图形中数据排列的规律。q另一种思路另一种思路n先用一个数组按此顺序存储数据,先用一个数组按此顺序存储数据,再正常输出;再正常输出;15286310974q可不可以从可不可以从1最大数,通过循环,直接输出?最大数,通过循环,直接输出?nprintf是按照从左至右、从上至下的顺序;若想直接输出,是按照从左至右、从上至下的顺序;若想直接输出,只有找出公式,循环计算得到序列:只有找出公式,循环计算得到序列:1-n-5-2-n-8-6-3-n-10-9-7-4
10、.n为数组赋值,也要用循环,如何循环?为数组赋值,也要用循环,如何循环?又要回到找规律公式的路上吗?又要回到找规律公式的路上吗?n斜着能循环吗?斜着能循环吗?10第10页,共70页,编辑于2022年,星期一1 循环设计要点循环设计要点-例例3n用斜行、列描述新的循环方向。用斜行、列描述新的循环方向。15286310974斜斜1,1a1,1斜斜1,2a2,2斜斜1,3a3,3斜斜1,4a4,4斜斜2,1a2,1斜斜2,2a3,2斜斜2,3a4,3n列号相同;列号相同;n行号行号(显然行号与列号有关显然行号与列号有关)q第第1斜行,对应行号斜行,对应行号1n,行号与列号,行号与列号j同;同;q第第
11、2斜行,对应行号斜行,对应行号2n,行号比列号,行号比列号j大大1;q第第3斜行,对应行号斜行,对应行号3n,行号比列号,行号比列号j大大2;斜斜3,1a3,1斜斜3,2a4,2斜行斜行i取值取值(1n)列列j取值取值(1n+1-i)ai-1+jjn这样可以描述循环。但数组元素的存取还是基这样可以描述循环。但数组元素的存取还是基于于“行列行列”,能否简单转换?,能否简单转换?n关键问题:第关键问题:第i斜行、斜行、j列的数据对应于第几列的数据对应于第几行第几列的元素?行第几列的元素?斜斜4,1a4,111第11页,共70页,编辑于2022年,星期一1 循环设计要点循环设计要点-例例3main(
12、)int i,j,a100100,n,k;input(n);k=1;for(i=1;i=n;i=i+1)for(j=1;j=n+1-i;j=j+1)ai-1+jj=k;k=k+1;for(i=1;i=n;i=i+1)print(“换行符换行符”);for(j=1;j=i;j=j+1)print(aij);斜行斜行i取值取值(1n)列列j取值取值(1n+1-i)1528631097412第12页,共70页,编辑于2022年,星期一2 递归设计思路递归设计思路-例例4n程序结构化设计的三种基本结构,顺序、选择、循环是不程序结构化设计的三种基本结构,顺序、选择、循环是不是必须的?是必须的?n例例4根
13、据参数根据参数n,计算,计算1+2+n。void sum_loop(int n)int i,sum=0;for(i=1;i=n;i+)sum=sum+i;printf(nsum=%d,sum);ni sumn回答:在很多高级语言中,不是。可以抛弃谁呢?回答:在很多高级语言中,不是。可以抛弃谁呢?n递归能取代循环的作用递归能取代循环的作用。13第13页,共70页,编辑于2022年,星期一2 递归设计思路递归设计思路-例例4n例例4根据参数根据参数n,计算,计算1+2+n。int sum_recursive(int n)int sum=0;if(n=1)sum=1;else sum=sum_rec
14、ursive(n-1)+n;printf(nsum=%d,sum);return sum;sum(n)sum(n-1)n+sum(n-2)n-1+.sum(n-3)n-2+1n递归算法是一个模块递归算法是一个模块(函数、过程函数、过程)除了可调用其它模除了可调用其它模块块(函数、函数、过程过程)外,还可以直接或间接地调用自身的算法。直接外,还可以直接或间接地调用自身的算法。直接/间接递归调间接递归调用。用。n代入代入n=4,走一遍。,走一遍。递归树!递归树!sum(1)2+14第14页,共70页,编辑于2022年,星期一2 递归设计思路递归设计思路-例例4n例例4根据参数根据参数n,计算,计算
15、1+2+n。int sum_recursive(int n)int sum=0;if(n=1)sum=1;else sum=sum_recursive(n-1)+n;printf(nsum=%d,sum);return sum;栈顶栈顶(top)栈底栈底(bottom)出栈出栈 进栈进栈 栈底元素栈底元素 栈顶元素栈顶元素栈顶元素栈顶元素 n sumn-1 sum.;2 sum1 sum表面上是一个变量,表面上是一个变量,实际上是一个实际上是一个栈栈15第15页,共70页,编辑于2022年,星期一2 递归设计思路递归设计思路-例例4n例例4根据参数根据参数n,计算,计算1+2+n。int su
16、m_recursive(int n)int sum=0;if(n=1)sum=1;else sum=sum_recursive(n-1)+n;printf(nsum=%d,sum);return sum;nT(n)=T(n-1)+O(1)sum(1)sum(n)sum(n-1)n+sum(n-2)n-1+.sum(n-3)n-2+2+1=T(n-2)+O(1)+O(1)=.=n*O(1)=O(n)16第16页,共70页,编辑于2022年,星期一“收敛收敛”3 递归设计要点递归设计要点n递归的关键在于找出递归的关键在于找出递归方程式递归方程式和和递归终止条件递归终止条件。q递归定义:使问题向边界
17、条件转化的规则。递归定义必递归定义:使问题向边界条件转化的规则。递归定义必须能使问题越来越简单。须能使问题越来越简单。q递归边界条件:也就是所描述问题的最简单情况,它本递归边界条件:也就是所描述问题的最简单情况,它本身不再使用递归的定义。身不再使用递归的定义。int sum_recursive(int n)int sum=0;if(n=1)sum=1;else sum=sum_recursive(n-1)+n;printf(nsum=%d,sum);return sum;sum(n)sum(n-1)n+sum(n-2)n-1+.sum(n-3)n-2+sum(1)2+117第17页,共70页,
18、编辑于2022年,星期一例例1.1 欧几里德算法欧几里德算法ngcd(m,n)=gcd(n,m mod n)n输入输入 正整数正整数m和和n 输出输出 m和和n的最大公因子的最大公因子1.如果如果n=0,计算停止返回计算停止返回m,m即为结果;否则继续即为结果;否则继续2。2.记记r为为m除以除以n的余数,即的余数,即r=m mod n。3.把把n赋值给赋值给m,把,把r赋值给赋值给n,继续,继续1。n伪代码如下伪代码如下(循环循环):Euclid(m,n)while n 0 r=m mod n;m=n;n=r;递归代码:递归代码:GCD(m,n)/约定约定mn/if n=0 return(m
19、)else return(GCD(n,m mod n)18第18页,共70页,编辑于2022年,星期一GCD(22,8)GCD(8,6)GCD(6,2)GCD(2,0)2递推递推递递推推递递推推递递推推回回归归回回归归回回归归回归回归结果为结果为GCD(22,8)=2 例:例:GCD(22,8)=GCD(8,6)=GCD(6,2)=GCD(2,0)=2;19第19页,共70页,编辑于2022年,星期一3 递归设计要点递归设计要点-hanoi塔塔nHanoi塔塔qhanoi河内河内越南首都越南首都q古代有一个梵塔,塔内有古代有一个梵塔,塔内有3个基座个基座A、B、C,q开始时开始时A基座上有基座
20、上有64个盘子,盘子大小不等,大的在下,个盘子,盘子大小不等,大的在下,小的在上。小的在上。q有一个老和尚想把这有一个老和尚想把这64个盘子从个盘子从A座移到座移到B座,但每次座,但每次只允许移动一个盘子,且在移动过程中在只允许移动一个盘子,且在移动过程中在3个基座上的个基座上的盘子都始终保持大盘在下,小盘在上。盘子都始终保持大盘在下,小盘在上。q在移动过程中可以利用在移动过程中可以利用C基座做辅助。基座做辅助。q请编程打印出移动过程请编程打印出移动过程。q约定盘子自上而下的编号为约定盘子自上而下的编号为1,2,3,n。20第20页,共70页,编辑于2022年,星期一3 递归设计要点递归设计要
21、点-hanoi塔塔n首先看一下首先看一下2阶汉诺塔问题的解,不难理解以下移动过程:阶汉诺塔问题的解,不难理解以下移动过程:n初始状态为初始状态为A(1,2)B()C()q第一步后第一步后A(2)B()C(1)q第二步后第二步后A()B(2)C(1)q第三步后第三步后A()B(1,2)C()n用递归思路考虑用递归思路考虑21第21页,共70页,编辑于2022年,星期一3 递归设计要点递归设计要点-hanoi塔塔n把把n个盘子抽象地看作个盘子抽象地看作“两个盘子两个盘子”,上面,上面“一个一个”由由1n-1号号组成,下面组成,下面“一个一个”就是就是n号盘子。移动过程如下:号盘子。移动过程如下:n
22、第一步:先把上面第一步:先把上面“一个一个”盘子以盘子以a基座为起点借助基座为起点借助b基座移到基座移到c基基座。座。n第二步:把下面第二步:把下面“一个一个”盘子从盘子从a基座移到基座移到b基座。基座。n第三步:再把第三步:再把c基座上的基座上的n-1盘子借助盘子借助a基座移到基座移到b基座。基座。22第22页,共70页,编辑于2022年,星期一3 递归设计要点递归设计要点-hanoi塔塔n把把n阶的汉诺塔问题的模块记作阶的汉诺塔问题的模块记作hanoi(n,a,b,c)qa代表每一次移动的起始基座;代表每一次移动的起始基座;qb代表每一次移动的终点基座;代表每一次移动的终点基座;qc代表每
23、一次移动的辅助基座代表每一次移动的辅助基座;q则则hanoi(n,a,c,b),表示把,表示把n个盘子从个盘子从a搬到搬到c,可以借助,可以借助b;qhanoi(5,c,a,b),表示把,表示把5个盘子从个盘子从c搬到搬到a,可以借助,可以借助b。n则汉诺塔问题则汉诺塔问题hanoi(n,a,b,c)等价于以下三步:等价于以下三步:q第一步,第一步,hanoi(n-1,a,c,b);q第二步,把下面第二步,把下面“一个一个”盘子从盘子从a基座移到基座移到b基座;基座;q第三步,第三步,hanoi(n-1,c,b,a)。n至此找出了大规模问题与小规模问题的关系。至此找出了大规模问题与小规模问题的
24、关系。23第23页,共70页,编辑于2022年,星期一3 递归设计要点递归设计要点-hanoi塔塔nhanoi(n,a,b,c)qa:起始基座:起始基座qb:终点基座:终点基座qc:辅助基座:辅助基座hanoi(n,a,b,c)hanoi(n-1,a,c,b)hanoi(n-1,c,b,a)移移hanoi(n-2,a,b,c)hanoi(n-2,b,c,a)移移hanoi(2,.,.,.)hanoi(2,.,.,.)移移hanoi(1,.,.,.)移移hanoi(1,.,.,.)hanoi(0,.,.,.)/hanoi(0,.,.,.)O(2n)24第24页,共70页,编辑于2022年,星期一
25、3 递归设计要点递归设计要点-hanoi塔塔nhanoi(intn,chara,charb,charc)/*a,b,c初值为初值为”A”,”B”,”C”*/if(n0)/*0阶的汉诺塔问题当作停止条件阶的汉诺塔问题当作停止条件*/hanoi(n-1,a,c,b);输出输出“Movedish”,n.”frompile”,a,”to”b);hanoi(n-1,c,b,a);25第25页,共70页,编辑于2022年,星期一4 非递归非递归(循环循环)/递归比较递归比较-非递归非递归hanoi塔塔n递归思路不适合人类使用:人脑的逆推深度是有限的,而递归思路不适合人类使用:人脑的逆推深度是有限的,而计算
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 基本 工具 幻灯片
限制150内