1.5 算法的表示
算法是用来解决实际问题的,问题简单,算法也简单;问题复杂,一般算法也相应地复杂。为了便于交流和进行算法处理,往往首先需要将算法进行描述,也就是算法的表示。一般来说,算法可以采用自然语言表示、流程图表示、N-S图表示和伪代码表示这几种方式。
1.5.1 自然语言表示
所谓自然语言,就是自然地随着文化演化而来的语言,如汉语、英语等。通俗地讲,自然语言就是我们平时口头描述的语言。对于一些简单的算法,可以采用自然语言口头描述算法的执行过程,例如前面的事件A、B、C统筹安排的例子。
但是,随着需求的发展,很多算法都比较复杂,很难用自然语言来描述,同时自然语言的表述烦琐难懂,不利于交流和发展。因此,需要采用其他的方式进行表示。
其实,我国古代早期的算法也可以看作是自然语言表示。正是由于这种复杂、烦琐的自然语言表示大大阻碍了中国古代算法的发展。这也正是我国古代算法起源早,但后来却落后于西方国家的原因。
1.5.2 流程图表示
流程图是一种图形表示算法流程的方法,由一些图框和流程线组成,如图1-3所示。其中,图框表示各种操作的类型,图框中的说明文字和符号表示该操作的内容,流程线表示操作的先后次序。
流程图最大的优点便是简单直观、便于理解,在计算机算法领域有着广泛的应用。例如,计算两个输入数据a和b的最大值,可以采用图1-4所示的流程图来表示。
图1-3 流程图的图元
图1-4 求最大值的流程图
在实际使用中,一般采用如下3种流程结构。
1.顺序结构
顺序结构是最简单的一种流程结构,一个接着一个进行处理,如图1-5所示。一般来说,顺序结构适合于简单的算法。
2.分支结构
分支结构常用于根据某个条件来决定算法走向的场合,如图1-6所示。这里首先判断条件P,如果P成立,则执行B,否则执行A,然后再继续下面的算法。分支结构有时也称为条件结构。
图1-5 顺序结构
图1-6 分支结构
3.循环结构
循环结构常用于需要反复执行的算法操作,按照循环的方式的不同,可以将其分为当型循环结构和直到型循环结构,分别如图1-7和图1-8所示。
图1-7 当型循环结构
图1-8 直到型循环结构
当型循环结构和直到型循环结构的区别如下:
当型循环结构先对条件进行判断,然后再执行,一般采用while语句来实现。
直到型循环结构先执行,然后再对条件进行判断,一般采用until、do…while等语句来实现。
注意:无论使用当型循环结构还是直到型循环结构,都需要进行合适的处理,以确保最终能够跳出循环,否则将构成死循环,而死循环是没有任何意义的。
一般来说,采用上述3种流程结构,可以完成所有的算法任务。通过合理地安排流程结构,可以构成结构化的程序,这样便于算法程序的开发和交流。
1.5.3 N-S图表示
N-S图也被称为盒图或CHAPIN图,1973年由美国学者I.Nassi和B.Shneiderman提出。他们发现采用流程图可以清楚地表示算法或程序的运行过程,但其中的流程线并不是必需的,因此创立了N-S图。在N-S图中,把整个程序写在一个大框图内,这个大框图由若干个小的基本框图构成。采用N-S图也可以方便地表示流程图的内容。
采用N-S图表示的顺序结构如图1-9所示。采用N-S图表示的分支结构如图1-10所示。采用N-S图表示的当型循环结构如图1-11所示。采用N-S图表示的直到型循环结构如图1-12所示。
图1-9 顺序结构
图1-10 分支结构
图1-11 当型循环结构
图1-12 直到型循环结构
1.5.4 伪代码表示
伪代码(Pseudocode)是另外一种算法描述的方式。伪代码并非真正的程序代码,其介于自然语言和编程语言之间。因此,伪代码并不能在计算机上运行。使用伪代码的目的是将算法描述成一种类似于编程语言的形式,例如C、C++、Java、Pascal等。这样,程序员便可以很容易理解算法的结构,再根据编程语言的语法特点,稍加修改,便可以实现一个真正的算法程序。
伪代码在C语言中得到广泛的应用,其他语言(C++、Java、C#等)大都借鉴了C语言的语法特点。这些编程语言在很大程度上都和C语言类似,例如,都采用if语言表示条件分支和判断,采用for语句、while语句表示循环等。因此,可以利用这些共性来描述算法,忽略编程语言之间的差异。
在使用伪代码表示算法时,程序员可以使用自然语言来进行表述,也可以采用简化的编程语句来表示,相当随意。不过,为了编程代码的交流和重利用,程序员还是应该尽可能表述得清楚明了。
下面举一个简单的使用伪代码表示的程序代码的例子。
其中,演示的是求两个数据最大值的伪代码。首先将输入的数据分别赋值给变量a和变量b,然后通过if语句进行判断,将最大者赋值给变量max,最后输出变量max。从这个例子中可以看出,伪代码表示很随意,但又高度接近编程语言。程序员可以根据这段伪代码和某种编程语言的语法特点进行修改,从而得到真正可执行的程序代码。
在使用伪代码时,必须结构清晰、代码简单、可读性强,这样才能更有利于算法的表示。否则将适得其反,让人很难懂,这样就失去了伪代码表示的意义。