首页 理论教育算法的表示-《计算机导论》

算法的表示-《计算机导论》

【摘要】:当把算法用于人类和计算机之间传递智能时,文字形式算法的主要缺点是表示方法不规范,不同的人描述的相同的算法在用词和语句上有很大差异。又例如,计算机在执行每条语句前,需要首先“识别”出每条语句,C语言程序中每条语句结束后增加的语句结束标记符号“;”,表示当前的一条语句到此结束,这样的标识就方便了计算机对程序语句的“识别”。

在第1章和本章前两节中,我们在表示算法时使用了几种不同的表示方法,这也就是说,一个相同含义的算法可以有几种不同的表示方法。概括来说,算法主要有三种表示形式,即文字形式、伪码形式和程序设计语言形式。

1.文字形式

算法的步骤可以用文字形式来表示。求解两个整数的最大公约数的文字形式的算法重述如下:

(1)令M为两个整数中的较大者,N为两个整数中的较小者;

(2)用M除以N,令R为M除以N的余数;

(3)若R不等于0,则令M等于N,N等于R,返回步骤(2)继续;若R等于0,则N中的数值就是两个整数的最大公约数。

文字形式的算法主要用在人类之间传递思想和智能。当把算法用于人类和计算机之间传递智能时,文字形式算法的主要缺点是表示方法不规范,不同的人描述的相同的算法在用词和语句上有很大差异。显然,文字形式的算法很难让计算机来理解和执行。

2.伪码形式

算法的步骤可以用6.2节讨论的基本语句格式来构成。由于6.2节讨论的基本语句不是计算机能直接理解和执行的程序语句,而是一种仿程序语句的形式,所以也称作伪码。这样的算法表示方法称作算法的伪码形式。求解两个整数的最大公约数的伪码形式的算法如下:

PROCEDURE CommDivisor(m,n)

{

IF(m<n)THEN

{

ASIGN temp m

ASIGN m n

ASIGN n temp

}

ASIGN r m%n

WHILE(r!=0)DO

{

ASIGN m n

ASIGN n r

ASIGN r m % n

}

}

由于伪码规定了特定符号的含义和固定的语句格式,所以伪码形式的算法结构非常固定。虽然伪码形式的算法只能用在人类之间传递思想和智能,但是,由于伪码的每个基本语句和任何计算机高级语言的语句格式都非常接近,所以,可以很方便地把伪码形式的算法转变为计算机可以直接理解和执行的任何计算机高级语言的程序。

另外,对比伪码形式的算法和下面程序形式的算法,可以发现,伪码形式的算法更加简洁,伪码形式的算法不需要考虑程序实现所要求的细节描述。伪码形式的算法主要用在人类之间传递思想和智能。(www.chuimin.cn)

3.程序设计语言形式

在第1章我们就定义过,程序是用程序设计语言表示出来的算法,或者说,程序是处理特定问题的计算机可识别的步骤集合。因此,算法也可以用某种计算机程序设计语言来表示,这称为算法的程序形式。求解两个整数的最大公约数的C语言函数(C语言中的函数相当于伪码中的过程)如下:

int CommDivisor(int m,int n)

{

int temp,r;

if(m<n)

{

temp=m;

m=n;

n=temp;

}

r=m%n;

while(r!=0)

{

m=n;

n=r;

r=m%n;

}

return r;

}

对比求解两个整数的最大公约数算法的伪码形式和C语言程序形式,可以发现,其差别主要有以下三点:

(1)在C语言程序中,所有变量在第一次出现时,前边都增加了符号int,这称为变量定义。在所有高级语言中,变量定义是指给变量分配一个具体大小的存储单元空间。在上述的例子中,语句“int temp,r”表示给变量temp和变量r的每一个变量分配大小为4个字节的存储单元空间。例中,参数m和参数n也是变量,也需要在使用前进行定义,即在使用前分配具体的存储单元空间,这里,参数m和参数n前面增加的符号“int”,表示给参数m和参数n分配的存储空间大小为4个字节。另外,过程名(即C语言的函数名)也是变量,所以,函数名CommDivisor前也增加了符号“int”,表示给函数名CommDivisor分配的存储空间大小为4个字节。

(2)在C语言程序中,赋值语句采用了更为简单的表示形式。例如,C语言程序中的语句“temp=m;”就表示伪码形式算法的语句“ASIGN temp m”。

(3)在C语言程序中,每条语句结束后都增加了语句的结束标记符号“;”。

(4)在C语言程序的最后一行,增加了一条“return r;”语句,该语句是C语言程序实现过程的数据传送所必须的。

上述C语言程序中增加的部分,都属于把算法转换为程序时要考虑的“细节”。这是因为,程序是要让计算机具体运行的,如果没有上述“细节”,计算机就无法运行程序。例如,如果C语言程序中不定义变量temp,计算机就无法知道变量temp需要分配多大的存储单元空间,该变量是需要占用4个字节呢,还是需要占用8个字节?我们在第2章讨论过,存储单元的字节数不同,该存储单元存放的数据(即这里的变量)的数值范围就不同。4个字节的存储单元可表示的数据的数值范围为﹣32768~+32767,如果要处理的数据大于这个范围,就要定义占用更大存储单元空间的变量。又例如,计算机在执行每条语句前,需要首先“识别”出每条语句,C语言程序中每条语句结束后增加的语句结束标记符号“;”,表示当前的一条语句到此结束,这样的标识就方便了计算机对程序语句的“识别”。C语言程序中增加的上述内容,都属于前面所说的程序语言要考虑的细节。