算法

一个程序主要包括以下两方面的信息:

(1)对数据的描述。

      在程序中要指定用到哪些数据以及这些数据的类型和它们的组织形式。这就是数据结构。

(2)对操作的描述。

      即要求计算机进行操作的步骤,也就是算法

著名计算机科学家沃思提出一个公式:算法+数据结构=程序 直到今天,这个公式对于过程化程序来说依然是适用的。

注意:不要认为只有“计算”的问题才有算法,广义地说,为解决一个问题而采用的方法和步骤就称为“算法”。

计算机算法可分为两大类:数值运算算法非数值运算算法数值运算的目的是求数值解。非数值运算包括的面就十分广泛了,最常见的是用于事务管理领域,例如图书检索和人事管理等。目前,计算机在非数值运算方面的应用远超在数值运算方面的应用。

一个有效的算法应该具有以下特点:

(1)有穷性。一个算法应包含有限的操作步骤,而不能是无限的。事实上,“有穷性”往往指“在合理范围之内”,如果让计算机执行一个历时100年才结束的算法,这虽然是有穷的,但超过了合理的限度,人们也不把它视为有效算法。究竟什么算“合理限度”,由人们的常识和需要判定。

(2)确定性。算法中的每一个步骤都应当是确定的,而不应当是含糊的、模棱两可的。也就是说,算法的含义应当是唯一的,而不应当产生“歧义性”。

(3)零个或多个输入。所谓输入就是指在执行算法时需要从外界取得必要的信息。

(4)有一个或多个输出。算法的目的是为了求解,“解”就是输出。但算法的输出并不一定就是计算机的打印输出或屏幕输出,一个算法得到的结果就是算法的输出。没有输出的算法是没有意义的。

(5)有效性。算法中的每一个步骤都应当能有效地执行,并得到确定的结果。例如,若b=0,则a/b是不能有效执行的。

为了表示一个算法,可以用不同的方法:自然语言、流程图(传统流程图、结构化流程图 N-S结构化流程图(N-S流程图或N-S图))、伪代码、计算机语言。其中,N-S图如同一个多层的盒子,所以又称它为盒图。

简单的算法举例

用自然语言表示的算法如下:

1、判定1000—2000年中的每一年是否为闰年,并将结果输出。

   先分析闰年成立的条件:

(1)能被4整除,但不能被100整除的年份都是闰年。

(2)能被400整除的年份是闰年。

  设year为被检测的年份,算法可表示如下:

  S1:1000=>year。

  S2:若year不能被4整除,则输出year的值和“不是闰年”。然后转到S6,检查下一个年份。

  S3:若year能被4整除,但不能被100整除,则输出year的值和“是闰年”。然后转到S6。

  S4:若year能被400整除,输出year的值和“是闰年”。然后转到S6。

  S5:输出year的值和“不是闰年”(这一步是检测那些既能被4整除,又能被100整除,但不能被400整除的年份的,如1900年)

  S6:year+1=>year。

  S7:当year<=2000时,转S2继续执行,否则算法停止。

2、给出一个大于或等于3的正整数,判断它是不是一个素数。

  解题思路:所谓素数,是指除了1和它自身外,不能被其他自然数整除的数。判断一个数n(n>=3,最小的素数是2)是否为素数的方法是很简单的:将n作为被除数,将2—n-1各个整数先后作为除数,如果都不能被整除,则n为素数。

   算法可表示如下:

   S1:输入n的值。

   S2:i=2(i作为除数)

   S3:n被i除,得余数r。

   S4:如果r=0,表示n能被i整除,则输出n的值和“不是素数”,算法结束;否则执行S5。

   S5:i+1=>i。

   S6:如果i<=n-1,返回S3;否则输出n的值以及“是素数”,然后结束。

实际上,n不必被2—n-1的整数除,只需被2—n/2间整数除即可,甚至只需被2—n^(1/2)之间的整数除即可。

   S6':如果i<=n/2(或n^(1/2)),返回S3;否则输出n的值和“是素数”,然后结束。

用流程图表示的算法我就不一一列举了,不过我要介绍下三种基本结构:顺序结构、选择结构、循环结构。

顺序结构是最简单的一种基本结构。

选择结构又称选取结构分支结构在此结构中与判断框相连接的两个处理框可以有一个是空处理。

循环结构又称重复结构。有两类循环结构:型(while型)循环结构、直到型(until型)循环结构。

注意:当型(while型)循环结构是先判断,再执行,直到条件不成立为止。而直到型(until型)循环结构是先执行,再判断,直到给定的条件不成立为止。

以上3种结构,有以下共同特点:

(1)只有一个入口。

(2)只有一个出口。

(3)结构内的每一部分都有机会被执行到。也就是说,对每一个框来说,都应当有一条从入口到出口的路径通过它。

(4)结构内不存在“死循环”。

  • 由以上3种基本结构顺序组成的算法结构是可以解决任何复杂问题的。
  • 由基本结构所构成的算法属于“结构化”的算法(在此提及两点:1、如果一个算法不能分解为若干个基本结构,那它必然不是一个结构化的算法。2、一个非结构化的算法是可以用一个等价的结构化算法代替的,其功能不变。)。它不存在无规律的转向(这里是对用传统流程图表示的算法而言),只在基本结构内才允许存在分支和向前或向后的跳转。
  • 其实,基本结构并不一定只限于上面这3种,只要具有上述4个特点的都可以作为基本结构。人们可以自己定义基本结构,并由这些基本结构组成结构化程序。但是其他的(除上述3种外)基本结构可以认为是由上述3种基本结构演变过来的。因此,人们普遍认为最基本的结构就是上述3种。

流程图适合于表示一个算法,而伪代码更适合于在设计算时使用。伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法,自上而下的写下来,每一行(或几行)表示一个基本操作。它不用图形符号,因此书写方便、格式紧凑、修改方便,容易看懂,也便于向计算机语言算法(也就是程序)过渡。而且用伪代码很容易地就能写出结构化算法。

在此需要提及一点的是,无论你这个算法是用自然语言表示的,还是用流程图表示的,又或者是用伪代码表示的,计算机都不能执行,因为计算机根本都无法识别什么自然语言啊,流程图啊,伪代码什么的,而只有用计算机语言表示的算法才是计算机能够执行的(这么说其实有些牵强,我会在以后的博客分享中做出进一步的解释),而用计算机语言表示算法的同时必须要严格遵循所使用语言的语法规则,这也是和伪代码不同的一点。

  • 在设计好一个结构化的算法之后,还要善于进行结构化编码。所谓编码就是将已经设计好的算法用计算机语言来表示,即根据已经细化的算法正确地写出计算机程序。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值