已阅读5页,还剩65页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机程序设计基础,第四章算法,提纲,4.1算法概念与特征4.2算法描述4.3算法设计与实现4.4递归算法4.5容错4.6算法复杂度本章小结,4.1算法概念与特征,算法基本概念算法定义:解决问题的方法与步骤设计算法的目的:给出解决问题的逻辑描述,根据算法描述进行实际编程算法特征有穷性:算法在每种情况下都可以在有限步后终止确定性:算法步骤的顺序和内容没有二义性输入:算法有零个或多个输入输出:算法至少具有一个输出有效性:所有操作具有明确含义,并能在有限时间内完成正确性不是算法的特征,算法的正确性需要数学证明!,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,幻方填充步骤,步骤1:把1写在第一行中间一格步骤2:在该格右上方的那一格中写入下一自然数在此过程中,若该数已超出33幻方范围,则将该数书写在其所在的那一排或列的另一端格子中,即相当于认为幻方外围仍然包含了同样的幻方,而该数就写在外围幻方的同样位置每写完三个数,将第四个数写在第三个数下面格子中步骤3:重复步骤2,直到所有格子均填满,算法示例二:查英文单词,步骤1:翻开词典任意一页步骤2:若所要的词汇按字母排列顺序在本页第一个单词之前,则往前翻开任意一页,重复步骤2;若所查词汇在本页最后一个单词之后,则往后翻开任意一页,重复步骤2步骤3:若上述两条件均不满足,则该单词要么在本页上,要么词典中不存在依次比较本页单词,或者查出该单词,或者得到该单词查不到的结论,算法描述,伪代码混合自然语言与计算机语言、数学语言的算法描述方法优点:方便,容易表达设计者思想,能够清楚描述算法流程,便于修改缺点:不美观,复杂算法不容易理解流程图(程序框图)使用图形表示算法执行逻辑优点:美观,算法表达清晰缺点:绘制复杂,不易修改,占用过多篇幅,伪代码,顺序结构分支结构循环结构,执行某任务执行下一任务,if(条件表达式)switch(条件变量)处理条件为真的情况case常量表达式1:处理分支1elsecase常量表达式2:处理分支2处理条件为假的情况default:处理默认分支,for(初始化表达式;条件表达式;步进表达式)|while(条件表达式)循环体内部代码逻辑描述,流程图,常用流程图的框图与符号,幻方流程图,查单词流程图,4.3算法设计与实现,算法设计与实现构造算法解决问题按照自顶向下、逐步求精的方式进行使用程序设计语言编程实现典型示例素性判定问题最大公约数问题,素性判定问题,判断给定的某个自然数n(大于2)是否为素数算法逻辑输入:大于2的正整数n输出:该数是否为素数,若为素数返回TRUE,否则返回FALSE步骤1:设除数i为2步骤2:判断除数i是否已为n,若为真返回TRUE,否则继续步骤3:判断n%i是否为0,若为0返回FALSE,否则继续步骤4:将除数i递增,重复步骤2,素性判定函数入门版,验证其为算法:对照算法五个基本特征证明算法正确测试算法,BOOLIsPrime(unsignedintn)unsignedinti=2;while(in)if(n%i=0)returnFALSE;i+;returnTRUE;,素性判定函数家庭基本版,为什么可以使用sqrt(n)代替n?sqrt为标准库中的求平方根函数,BOOLIsPrime(unsignedintn)unsignedinti=2;while(i=(unsignedint)sqrt(n)if(n%i=0)returnFALSE;i+;returnTRUE;,素性判定函数家庭高级版,家庭高级版有什么改进?,BOOLIsPrime(unsignedintn)unsignedinti;if(n%2=0)returnFALSE;i=3;while(i=(unsignedint)sqrt(n)if(n%i=0)returnFALSE;i+=2;returnTRUE;,素性判定函数小型企业版,小型企业版有什么改进?,BOOLIsPrime(unsignedintn)unsignedinti;if(n%2=0)returnFALSE;i=3;while(i=(unsignedint)sqrt(n)+1)if(n%i=0)returnFALSE;i+=2;returnTRUE;,素性判定函数大型企业版,大型企业版有什么改进?,BOOLIsPrime(unsignedintn)unsignedinti,t;if(n%2=0)returnFALSE;i=3;t=(unsignedint)sqrt(n)+1;while(i=t)if(n%i=0)returnFALSE;i+=2;returnTRUE;,算法选择,算法选择的权衡指标正确性:算法是否完全正确?效率:在某些场合,对程序效率的追求具有重要意义可理解性:算法是否容易理解,也是必须要考虑的算法评估:衡量算法的好坏,主要是效率,最大公约数问题,求两个正整数x与y的最大公约数函数原型设计unsignedintgcd(unsignedintx,unsignedinty);,最大公约数函数:穷举法,unsignedintgcd(unsignedintx,unsignedinty)unsignedintt;t=xy?x:y;while(x%t!=0|y%t!=0)t-;returnt;,最大公约数函数:欧氏算法,输入:正整数x、y输出:最大公约数步骤1:x整除以y,记余数为r步骤2:若r为0,则最大公约数即为y,算法结束步骤3:否则将y作为新x,将r作为新y,重复上述步骤unsignedintgcd(unsignedintx,unsignedinty)unsignedintr;while(TRUE)r=x%y;if(r=0)returny;x=y;y=r;,4.4递归算法,递归问题的引入递推公式:数学上非常常见例一:阶乘函数:0!=1,n!=n(n-1)!例二:斐波那契数列函数:f(1)=f(2)=1,f(n)=f(n-1)+f(n-2)递推函数一定是分段函数,具有初始表达式递推函数的计算逻辑:逐步简化问题规模递归的工作步骤递推过程:逐步分解问题,使其更简单回归过程:根据简单情形组装最后的答案,阶乘函数,使用循环实现unsignedintGetFactorial(unsignedintn)unsignedintresult=1,i=0;while(+i%sn,n,from_str,to_str);voidMoveHanoi(unsignedintn,HANOIfrom,HANOItmp,HANOIto)if(n=1)MovePlate(n,from,to);elseMoveHanoi(n-1,from,to,tmp);MovePlate(n,from,to);MoveHanoi(n-1,tmp,from,to);,递归信任,递归实现是否检查了最简单情形在尝试将问题分解成子问题前,首先应检查问题是否已足够简单在大多数情况下,递归函数以if开头如果程序不是这样,仔细检查源程序是否解决了最简单情形大量递归错误是由没有正确解决最简单情形导致的最简单情形不能调用递归递归分解是否使问题更简单只有分解出的子问题更简单,递归才能正确工作,否则将形成无限递归,算法无法终止,递归信任,问题简化过程是否能够确实回归最简单情形,还是遗漏了某些情况如汉诺塔问题需要调用两次递归过程,程序中如果遗漏了任意一个都会导致错误子问题是否与原始问题完全一致如果递归过程改变了问题实质,则整个过程肯定会得到错误结果使用递归信任时,子问题的解是否正确组装为原始问题的解将子问题的解正确组装以形成原始问题的解也是必不可少的步骤,4.5容错,容错的定义:允许错误的发生错误的处理很少见的特殊情况或普通错误:忽略该错误不对程序运行结果产生影响用户输入错误:通知用户错误性质,提醒用户更正输入致命错误:通知用户错误的性质,停止执行典型容错手段数据有效性检查程序流程的提前终止断言与不变量,数据有效性检查,voidGetUserInput()获取用户输入数据while(用户输入数据无效)通知用户输入数据有误,提醒用户重新输入数据重新获取用户输入数据voidInput()c=GetFloat(Inputatemperaturevalue(C):);while(c=absolute_zero)printf(Thetemperaturevalueisbelow%.2f.n,absolute_zero);c=GetFloat(Inputatemperaturegreaterthantheabsolutezero:);,程序流程的提前终止,constintfailed_in_testing_primality=1;BOOLIsPrime(unsignedintn)unsignedinti,t;if(n=1)printf(IsPrime:Failedintestingtheprimalityof%d.,n);exit(failed_in_testing_primality);if(n=2)returnTRUE;if(n%2=0)returnFALSE;i=3;t=(unsignedint)sqrt(n)+1;while(i=t)if(n%i=0)returnFALSE;i+=2;returnTRUE;,素性判定函数终极版,BOOLIsPrime(unsignedintn)unsignedinti,t;if(n=1)PrintErrorMessage(FALSE,IsPrime:Failedintestingtheprimalityof%d.,n);if(n=2)returnTRUE;if(n%2=0)returnFALSE;i=3;t=(unsignedint)sqrt(n)+1;while(i1);if(n=2)returnTRUE;if(n%2=0)returnFALSE;i=3;t=(unsignedint)sqrt(n)+1;while(i1);if(n=2)returnTRUE;if(n%2=0)returnFALSE;i=3;t=(unsignedint)sqrt(n)+1;while(i=t)if(n%i=0)returnFALSE;i+=2;returnTRUE;,算法复杂度,引入算法复杂度的目的度量算法的效率与性能大O表达式算法效率与性能的近似表示(定性描述)算法执行时间与问题规模的关系表示原则忽略所有对变化趋势影响较小的项,例如多项式忽略高阶项之外的所有项忽略所有与问题规模无关的常数,例如多项式的系数,标准算法复杂度类型,O(1):常数级,表示算法执行时间与问题规模无关O(log(n):对数级,表示算法执行时间与问题规模的对数成正比O(sqrt(n):平方根级,表示算法执行时间与问题规模的平方根成正比O(n):线性级,表示算法执行时间与问题规模成正比O(n*log(n):n*log(n)级,表示算法执行时间与问题规模的n*log(n)成正比O(n2):平方级,表示算法执行时间与问题规模的平方成正比,算法复杂度估计,for(i=0;in;i+)printf(No.%d:Hello,World!n,i);for(i=0;in;i+)for(j=0;jn;j+)printf(Hello,World!n);for(i=0;in;i+)for(j=i;jn;j+)printf(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国际企业跨境业务扩张方案报告
- 智慧城市AI开发工程师的工作计划
- 制造业企业生产部经理的生产流程优化计划
- 以创意引领未来-对当代室內設计師應試能力的全面分析
- 唯品会电商客服面试问题及解答
- 中国农业科学院农产品研发计划书
- 网络工程师项目经理面题宝典
- 软件开发团队软件测试与优化绩效评定表
- 健身教练会员训练计划与业绩提升绩效考核表
- 海外购物安全承诺书4篇范文
- 2024年首都医科大学辅导员招聘考试真题汇编附答案
- 2025年全国较大安全生产事故及重大自然灾害简记
- 2026年江西科技学院单招职业技能测试题库含答案
- GB/T 41424.2-2025皮革沾污性能的测定第2部分:马丁代尔摩擦法
- 汽车员工代购合同范本
- 手写板输入文字课件
- 2026年湖南高速铁路职业技术学院单招职业技能测试必刷测试卷完美版
- 2021新安全生产法课件
- 绿色电厂营销方案
- T-CHSA 104-2025 咬合板治疗颞下颌关节紊乱病专家共识
- 2026年江西外语外贸职业学院单招职业技能测试必刷测试卷必考题
评论
0/150
提交评论