- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第三章;第三章 算法基本工具和优化技巧 ;
3.1.1 循环设计要点
3.1.2 递归设计要点
3.1.3 递归与循环的比较
;3.1.1 循环设计要点 1.设计中要注意算法的效率 2.“自顶向下”的设计方法 3.由具体到抽象设计循环结构 ; 循环体的特点是:“以不变应万变”。
所谓“不变”是指循环体内运算的表现形式是不变的,而每次具体的执行内容却是不尽相同的。在循环体内用不变的运算表现形式去描述各种相似的重复运算。;【例1】 求1/1!-1/3!+1/5!-1/7!+…+(-1)n+1/(2n-1)!分析:此问题中既有累加又有累乘,准确地说累加的对象是累乘的结果。数学模型1:Sn=Sn-1+(-1)n+1/(2n-1)!算法设计1:多数初学者会直接利用题目中累加项通式,构造出循环体不变式为: S=S+(-1)n+1/(2n-1)!需要用二重循环来完成算法,算法1如下:;算法如下:;算法分析:
以上算法是二重循环来完成 ,但算法的效率却太低是O(n2)。
其原因是,当前一次循环已求出7!,当这次要想求9!时,没必要再从1去累乘到9,只需要充分利用前一次的结果,用7!*8*9即可得到9!,模型为An=An-1*1/((2*n-2)*(2*n-1)。另外运算sign = sign *(-1);总共也要进行n*(n-1)/2次乘法,这也是没有必要的。下面我们就进行改进。
;数学模型2:Sn=Sn-1+(-1)n+1An; An=An-1 *1/((2*n-2)*(2*n-1));算法说明2:构造循环不变式时,一定要注意循环变量的意义,如当i不是项数序号时(右边的循环中)有关t的累乘式与i是项数序号时就不能相同。算法分析:按照数学模型2,只需一重循环就能解决问题算法的时间复杂性为O(n)。 ;2.“自顶向下”的设计方法 自顶向下的方法是从全局走向局部、从概略走向详尽的设计方法。自上而下是系统分解和细化的过程。 ;1)这里不是要质因数,所以找到因数后也无需将其从数据中“除掉”。
2)每个因数只记一次,如6的因数为1,2,3;算法如下:; 对于不太熟悉的问题,其数学模型或“机械化操作步骤”的不易抽象,下面看一个由具体到抽象设计循环细节的例题。
【例4】编写???法:打印具有下面规律的图形。
1
5 2
8 6 3
10 9 7 4
;算法设计:容易发现图形中自然数在矩阵中排列的规律,题目中1,2,3,4所在位置我们称为第1层(主对角线),例图中5,6,7所在位置我们称为第二层,……。一般地,第一层有n个元素,第二层有n-1个元素……
基于以上数据变化规律,以层号作为外层循环,循环变量为i(范围为1——n);以层内元素从左上到右下的序号作为内循环,循环变量为j(范围为1——n+1-i)。这样循环的执行过程正好与“摆放”自然数的顺序相同。用一个变量k模拟要“摆放”的数据,下面的问题就是怎么样将数据存储到对应的数组元素。
; 数组元素的存取,只能是按行、列号操作的。所以下面用由具体到抽象设计循环的“归纳法”,找出数组元素的行号、列号与层号i及层内序号j的关系:
1.每层内元素的列号都与其所在层内的序号j是相同的。因为每层的序号是从第一列开始向右下进行。
2.元素的行与其所在的层号及在层内的序号均有关系,具体地:
第一层行号1——n,行号与j同;
第二层行号2——n,行号比j大1;
第三层行号3——n,行号比j大2;
……
行号起点随层号i增加而增加,层内其它各行的行号又随层内序号j增加而增加,由于编号起始为1,i层第j个数据的列下标为i-1+j。
综合以上分析,i层第 j个数据对应的数组元素是a[i-1+j][j]。 ;main( )
{int i,j,a[100][100],n,k;
input(n);
k=1;
for(i=1;i=n;i=i+1)
for( j=1;j=n+1-i;j=j+1)
{a[i-1+j][j]=k;
k=k+1;}
for(i=1;i=n;i=i+1)
{print( “换行符”);
for( j=1;j=i;j=j+1)
print(a[i][j]);
}
}
;3.1.2 递归设计要点;递归的关键在于找出递归方程式和递归终止条件。;递归算法解题通常有三个步骤:
1)分析
原创力文档


文档评论(0)