
1.2 算法的描述方法

算法是对解题方案准确而完整的描述,这种描述是建立在程序设计语言的基础之上的。几乎每一种计算机程序设计语言都包括三种控制结构:顺序结构、选择(分支)结构和循环结构。因此,在算法描述时,通常都注重对这三种结构的标识和标记。尽管程序设计语言是建立算法的根本,但在描述时,算法设计人员要尽量避免用某一种语言去刻画算法,以减少特定语言对于算法实现的限制,突出算法描述的通用性。对于算法的描述方法有很多种,主要有自然语言、程序设计流程图、NS流程图、伪代码和计算机程序设计语言。下面进行简单介绍。
1. 自然语言
自然语言是人们进行交流时使用的语言,如汉语、英语等。使用自然语言描述算法时,要言简意赅,尽量用一句话概括一步运算,保证语句的意义完整、层次分明,避免冗长的描述,自然语言描述掌握起来比较容易,阅读方便,但也有以下一些明显的缺陷。
(1)没有统一的符号与语言标准,句式可能偏长。
(2)容易产生歧义。
(3)循环和分支较多时表述较困难。
(4)不便于转换成程序设计语言。
(5)描述语句受设计者语言水平影响较大。
2. 程序设计流程图
程序设计流程图常简称为流程图,是人们对解决问题的方法、思路或算法的一种描述。它采用美国国家标准学会(American National Standard Institute,ANSI)规定的一组图形符号来表示算法流程,利用图形化的符号框来表示各种不同性质的操作,并用流程线将这些操作连接起来。流程图可以清晰地表述程序设计语言的三种结构。流程图的标准图元如表1-1所示。
表1-1 流程图的基本符号

(1)顺序结构
算法的各个步骤按照顺序执行,每个步骤都有一个确定的前驱步骤和一个确定的后继步骤,语句执行顺序为A→B→C,如图1-1所示。

图1-1 顺序结构流程图
(2)选择(分支)结构
对某个给定表达式的值进行判断,值为真或假时分别执行不同的程序块,流程线上需要标明“真/假”或“T/F”或“Y/N”。选择结构分为if结构和switch结构两类。其中if结构有三种类型,分别为if结构、if-else结构和if-else-if结构三种,如图1-2所示。switch结构与if-else-if类似,也属于多条件分支结构,因此,也可以用if-else-if流程图来描述。但还有一种更为简洁的表示方法,如图1-3所示。

图1-2 if结构的三种流程图

图1-3 switch流程图
(3)循环结构
循环结构有三种:for、while和do-while。这三种结构虽然都是循环,但执行的过程是不同的,因此,它们的流程图描述也是不同的。
① for型循环:for(表达式1;表达式2;表达式3){…}。通常用表达式1来设置循环控制变量的初始值,用表达式2来设置循环控制变量应满足的条件,用表达式3来改变循环控制变量。如图1-4(a)所示,先执行表达式1,再计算表达式2的值,如其为真,执行语句块A,计算表达式3的值,继续判断表达式2的值是否为真,重复这一过程,直到表达式2的值为假时,退出循环。如果循环控制变量是在表达式1的值到表达式2的值之间,且递增或递减规律与表达式3相符合,则可以简化流程图,如图1-4(b)所示,若超出范围,将不再执行循环中的语句块,沿连接点向下执行。

图1-4 for型循环流程图
② while型循环:while(表达式){…}。首先计算表达式的值,当值为真时,反复执行语句块A,一旦值为假,则跳出循环,执行语句块A后的语句,如图1-5所示。

图1-5 while型循环流程图
③ do-while型循环:do{…}while(表达式)。首先执行语句块A,再判断计算表达式的值。值为真时,循环执行语句块A,一旦值为假,则跳出循环,执行表达式后的语句,如图1-6所示。

图1-6 do-while型循环流程图
程序设计流程图的优点是形象直观,各种操作一目了然,不会产生“歧义性”,便于理解,算法出错时容易被发现。它的缺点是所占篇幅较大,由于允许使用流程线,过于灵活,不受约束,使用者可使流程任意转向,从而造成程序阅读和修改上的困难,不利于结构化程序的设计。并且它不是逐步求精设计的好工具,有时会诱使算法设计人员过早地考虑算法的控制流程,而不去考虑算法的全局结构。
3. NS流程图
在程序设计流程图的使用过程中,人们发现流程线不一定是必需的,随着结构化程序设计方法的出现,1973年,美国学者I.纳斯(I. Nassi)和B. 施内德曼(B. Shneiderman)提出了一种新的流程图形式,这种流程图完全去掉了流程线,算法的每一步都用一个矩形框来描述,把一个个矩形框按执行的次序连接起来就是一个完整的算法描述。这种流程图用两位学者名字的第一个字母来命名,称为NS流程图。它对程序设计语言的三种基本控制结构的描述如图1-7所示。

图1-7 NS流程图
NS流程图的优点是支持自顶向下、逐步求精的设计思想,层次感强、嵌套明确。缺点是不易扩充和修改,不易描述大型复杂的算法。
4. 伪代码
伪代码介于自然语言与程序设计语言之间。以程序设计语言的书写形式指明算法职能,不用拘泥于具体实现,相比程序语言(如Java、C++、C、Dephi等),它更类似于自然语言,是不标准的程序设计语言。使用伪代码的目的是使被描述的算法可以容易地以任何一种编程语言实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。本书多数算法采用类C的描述方式,如例1-2。
5. 程序设计语言
程序设计语言是能够被计算机执行的算法描述,它是所有算法描述方法中最清晰的、简明的、严谨的表达。但它存在以下几个缺点。
(1)用特定的程序设计语言实现的算法,限制了使用不同程序语言的算法设计人员之间的交流。
(2)注重算法步骤的细节描述而忽视了算法的本质。
(3)掌握程序设计语言需要消耗大量的时间。