计算机程序设计基础 第四章算法.ppt
《计算机程序设计基础 第四章算法.ppt》由会员分享,可在线阅读,更多相关《计算机程序设计基础 第四章算法.ppt(71页珍藏版)》请在三一办公上搜索。
1、计算机程序设计基础,第四章 算 法,提 纲,4.1 算法概念与特征(阅读)4.2 算法描述(阅读)4.3 算法设计与实现(阅读)4.4 递归算法4.5 容 错4.6 算法复杂度本章小结,4.1 算法概念与特征,算法基本概念算法定义:解决问题的方法与步骤设计算法的目的:给出解决问题的逻辑描述,根据算法描述进行实际编程算法特征有穷性:算法在每种情况下都可以在有限步后终止确定性:算法步骤的顺序和内容没有二义性输入:算法有零个或多个输入输出:算法至少具有一个输出有效性:所有操作具有明确含义,并能在有限时间内完成正确性不是算法的特征,算法的正确性需要数学证明!,算法示例一:幻方,算法示例一:幻方,算法示
2、例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,算法示例一:幻方,三阶幻方填充步骤,步骤1:把 1 写在第一行中间一格步骤2:在该格右上方的那一格中写入下一自然数在此过程中,若该数已超出 3 3 幻方范围,则将该数书写在其所在的那一排或列的另一端格子中每写完三个数,将第四个数写在第三个数下面格子中步骤3:重复步骤2,直到所有格子均填满,算法示例二:查英文单词,步骤1:翻开词典任意一页步骤2:若所要的词汇按字母排列顺序在本页第一个单词之前,则往前翻开任意
3、一页,重复步骤2;若所查词汇在本页最后一个单词之后,则往后翻开任意一页,重复步骤2步骤3:若上述两条件均不满足,则该单词要么在本页上,要么词典中不存在依次比较本页单词,或者查出该单词,或者得到该单词查不到的结论,算法描述,伪代码混合自然语言与计算机语言、数学语言的算法描述方法优点:方便,容易表达设计者思想,能够清楚描述算法流程,便于修改缺点:不美观,复杂算法不容易理解流程图(程序框图)使用图形表示算法执行逻辑优点:美观,算法表达清晰缺点:绘制复杂,不易修改,占用过多篇幅,伪代码,顺序结构分支结构循环结构,执行某任务执行下一任务,if(条件表达式)switch(条件变量)处理条件为真的情况cas
4、e 常量表达式 1:处理分支 1elsecase 常量表达式 2:处理分支 2 处理条件为假的情况default:处理默认分支,for(初始化表达式;条件表达式;步进表达式)|while(条件表达式)循环体内部代码逻辑描述,流程图,常用流程图的框图与符号,幻方流程图,查单词流程图,4.3 算法设计与实现,算法设计与实现构造算法解决问题按照自顶向下、逐步求精的方式进行使用程序设计语言编程实现典型示例素性判定问题最大公约数问题,素性判定问题,判断给定的某个自然数 n(大于 2)是否为素数算法逻辑输入:大于 2 的正整数 n输出:该数是否为素数,若为素数返回 TRUE,否则返回 FALSE步骤 1:
5、设除数 i 为 2步骤 2:判断除数 i 是否已为 n,若为真返回 TRUE,否则继续步骤 3:判断 n%i 是否为 0,若为 0 返回 FALSE,否则继续步骤 4:将除数 i 递增,重复步骤 2,素性判定函数入门版,验证其为算法:对照算法五个基本特征证明算法正确测试算法,BOOL IsPrime(unsigned int n)unsigned int i=2;while(i n)if(n%i=0)return FALSE;i+;return TRUE;,C语言基本类型:int(long,short)char double float 定义类型:enum BOOL FALSE,TRUE;定义
6、布尔类型定义变量:enum BOOL bool;/缺点是每次定义变量,都需要书写 enum,很不方用typedef定义类型:typedef enum _BOOL FALSE,TRUE BOOL;,素性判定函数家庭基本版,为什么可以使用 sqrt(n)代替 n?sqrt 为标准库中的求平方根函数,BOOL IsPrime(unsigned int n)unsigned int i=2;while(i=(unsigned int)sqrt(n)if(n%i=0)return FALSE;i+;return TRUE;,素性判定函数家庭高级版,家庭高级版有什么改进?,BOOL IsPrime(uns
7、igned int n)unsigned int i;if(n%2=0)return FALSE;i=3;while(i=(unsigned int)sqrt(n)if(n%i=0)return FALSE;i+=2;return TRUE;,BOOL IsPrime(unsigned int n)unsigned int i=2;while(i=(unsigned int)sqrt(n)if(n%i=0)return FALSE;i+;return TRUE;,素性判定函数小型企业版,小型企业版有什么改进?,BOOL IsPrime(unsigned int n)unsigned int i
8、;if(n%2=0)return FALSE;i=3;while(i=(unsigned int)sqrt(n)+1)if(n%i=0)return FALSE;i+=2;return TRUE;,BOOL IsPrime(unsigned int n)unsigned int i;if(n%2=0)return FALSE;i=3;while(i=(unsigned int)sqrt(n)if(n%i=0)return FALSE;i+=2;return TRUE;,素性判定函数大型企业版,大型企业版有什么改进?,BOOL IsPrime(unsigned int n)unsigned in
9、t i,t;if(n%2=0)return FALSE;i=3;t=(unsigned int)sqrt(n)+1;while(i=t)if(n%i=0)return FALSE;i+=2;return TRUE;,BOOL IsPrime(unsigned int n)unsigned int i;if(n%2=0)return FALSE;i=3;while(i=(unsigned int)sqrt(n)+1)if(n%i=0)return FALSE;i+=2;return TRUE;,算法选择,算法选择的权衡指标正确性:算法是否完全正确?效率:在某些场合,对程序效率的追求具有重要意义可
10、理解性:算法是否容易理解,也是必须要考虑的算法评估:衡量算法的好坏,主要是效率,最大公约数问题,求两个正整数 x 与 y 的最大公约数函数原型设计unsigned int gcd(unsigned int x,unsigned int y);,最大公约数函数:穷举法,unsigned int gcd(unsigned int x,unsigned int y)unsigned int t;t=x y?x:y;while(x%t!=0|y%t!=0)t-;return t;,最大公约数函数:欧氏算法,输入:正整数 x、y输出:最大公约数步骤 1:x 整除以 y,记余数为 r步骤 2:若 r 为
11、0,则最大公约数即为 y,算法结束步骤 3:否则将 y 作为新 x,将 r 作为新 y,重复上述步骤unsigned int gcd(unsigned int x,unsigned int y)unsigned int r;while(TRUE)r=x%y;if(r=0)return y;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)递推函数一定是分段函数,具有初始表达式递推函数的计算逻辑:逐步简化问题规模递归的工作步骤递推过程:逐步分解
12、问题,使其更简单回归过程:根据简单情形组装最后的答案,阶乘函数,使用循环实现unsigned int GetFactorial(unsigned int n)unsigned int result=1,i=0;while(+i=n)result*=i;return result;使用递归实现unsigned int GetFactorial(unsigned int n)unsigned int result;if(n=0)result=1;elseresult=n*GetFactorial(n-1);return result;,斐波那契数列函数:f(1)=f(2)=1,f(n)=f(n-1
13、)+f(n-2),用递归方式实现:unsigned int GetFibonacci(unsigned int n)if(n=2|n=1)return 1;else return GetFibonacci(n-1)+GetFibonacci(n-2);,斐波那契数列函数,使用循环实现unsigned int GetFibonacci(unsigned int n)unsigned int result,i,f1,f2;if(n=2|n=1)return 1;f2=1;f1=1;for(i=3;i=n;i+)result=f1+f2;f1=f2;f2=result;return result;使
14、用递归实现unsigned int GetFibonacci(unsigned int n)if(n=2|n=1)return 1;elsereturn GetFibonacci(n-1)+GetFibonacci(n-2);,循环与递归的比较,循环使用显式的循环结构重复执行代码段,递归使用重复的函数调用执行代码段循环在满足其终止条件时终止执行,而递归则在问题简化到最简单情形时终止执行循环的重复是在当前迭代执行结束时进行,递归的重复则是在遇到对同名函数的调用时进行循环和递归都可能隐藏程序错误,循环的条件测试可能永远为真,递归可能永远退化不到最简单情形理论上,任何递归程序都可以使用循环迭代的方法
15、解决递归函数的码更短小精悍一旦掌握递归的思考方法,递归程序更易理解,递归函数调用的栈框架,#include#include zylib.hvoid PrintWelcomeInfo();unsigned int GetInteger(STRING prompt);unsigned int GetFactorial(unsigned int n);int main()unsigned int n,result;PrintWelcomeInfo();n=GetInteger(Input a non-negative number:);result=GetFactorial(n);printf(%d
16、!=%d.n,n,result);return 0;void PrintWelcomeInfo()printf(The program gets a number and computes the factorial.n);,递归函数调用的栈框架,unsigned int GetInteger(STRING prompt)unsigned int t;printf(prompt);t=GetIntegerFromKeyboard();return t;unsigned int GetFactorial(unsigned int n)unsigned int result;if(n=0)resu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机程序设计基础 第四章 计算机 程序设计 基础 第四
链接地址:https://www.31ppt.com/p-6342637.html