
1.4 算法的表示方法
一个算法可以用自然语言、传统流程图、N-S流程图或伪代码等方式来描述。1.2节中的算法都是使用自然语言描述的。使用自然语言描述算法通俗易懂,但比较冗长,容易产生歧义。
1.传统流程图和N-S流程图
传统流程图是用一些图框、流程线以及一些文字说明来描述操作过程的。使用流程图来表示算法,更加直观、易于理解。常用流程图符号如图1-4所示。

图1-4 常用流程图符号
传统流程图虽然形象直观,但对流程线的使用没有限制,使用者可以不受限制地使流程随意跳转,流程图可能变得毫无规律,不便于阅读。为了提高算法表示的质量,使算法更便于阅读,人们对流程图的表示方法进行了改进。1973年,美国学者I.Nassi和B.Shneiderman提出了N-S流程图。这种流程图去掉了带有箭头的流程线,更适合于结构化程序设计,因此更多地被应用于算法设计中。N-S流程图与传统流程图一样,唯一的区别是没有了流程线。
2.三种基本结构
1966年,Bohra和Jacopini提出了三种程序设计的基本结构:顺序结构、选择结构和循环结构。经过理论证明,无论多么复杂的算法,都可以表示为这三种基本结构的组合。
(1)顺序结构:顺序结构是三种基本结构中最简单的一种,程序在执行过程中会按照语句的先后顺序依次执行。图1-5(a)所示为传统流程图表示方式,图1-5(b)所示为N-S流程图表示方式。
(2)选择结构:选择结构又称分支结构,指在程序执行过程中经过判定条件的真假来选择执行下一步的操作。图1-6(a)、(b)所示为传统流程图表示方式,图1-6(c)所示为N-S流程图表示方式。

图1-5 顺序结构

图1-6 选择结构
(3)循环结构:循环结构用于重复执行相似或相同的操作,但循环应该在有限次循环后结束。循环结构有两种类型:当型循环和直到型循环。图1-7(a)所示为当型循环传统流程图表示方式,图1-7(b)所示为当型循环N-S流程图表示方式,图1-7(c)所示为直到型循环传统流程图表示方式,图1-7(d)所示为直到型循环N-S流程图表示方式。

图1-7 循环结构
以上三种结构具有以下共同特征:
(1)只有一个入口和一个出口。
(2)结构中的每一个部分都有可能被执行到。
(3)结构内不存在“死循环”。
【例1.4】用传统流程图表示【例1.1】的算法如图1-8所示,其N-S流程图如图1-9所示。

图1-8 【例1.1】传统流程图

图1-9 【例1.1】N-S流程图
【例1.5】用传统流程图表示【例1.2】的算法如图1-10所示,其N-S流程图如图1-11所示。

图1-10 【例1.2】传统流程图

图1-11 【例1.2】N-S流程图
【例1.6】用传统流程图表示n!的算法如图1-12所示,其N-S流程图如图1-13所示。

图1-12 n!传统流程图

图1-13 n!N-S流程图
3.伪代码
用传统流程图和N-S流程图表示算法,直观易懂,但画起来较为复杂,修改也比较烦琐,在设计算法时,也可以使用伪代码来表示。
伪代码是介于自然语言与程序设计语言之间的一种表示方式,书写方便,格式紧凑,可以很方便地向程序设计语言过渡。
【例1.7】用伪代码表示判断某一年份是否闰年的算法。
【解】伪代码具体如下:

学习提示:伪代码虽然与最终的程序设计语言不同,但在某些方面有相似之处,因此某些算法不能根据流程图很快写出代码时,可以使用伪代码进行过渡。