1.3 伪代码

为了使本书中描述的算法尽可能有用,首先我们用直观的术语来描述它们。有了这个高层次的解释,可以能够用大多数的编程语言来实现这些算法。

然而,一个算法的实现经常包含很多难以实现的琐碎细节。为了使这些细节易于处理,算法也用伪代码来描述。伪代码是很像编程语言但又不是真正的编程语言的一种文本。伪代码提供了代码实现算法过程中会用到的结构和细节,同时又不与某种特定的编程语言联系在一起。希望你能把这些伪代码翻译成真正的代码,然后在你的计算机上执行。

下面的代码片段展示了计算两个整数的最大公约数(GCD)算法的伪代码示例:

训练CNN 伪代码 伪代码基础_c#

取模操作
取模操作,在伪代码中写作Mod。它意味着整除之后的余数。比如说,13 Mod 4=1。因为13被4除,商是3,余数是1。

伪代码以一个注释开头。注释以字符“//”开始然后延伸到这一行的结束。

代码实际的第一行是算法的声明。这个算法叫做Gcd(最大公约数),它返回了一个整数结果。它有两个名为a和b的整数参数。

注 执行一个任务或者有选择地返回一个结果的一块代码称为例程、子例程、方法、过程、子过程或者函数。

声明之后的代码缩进以显示它是方法的一部分。方法主体的第一行以一个While循环开始。

只要While语句的条件保持为真,While下缩进的代码就会被执行。

While循环在End While语句处结束。End While语句并不是严格需要的,因为缩进显示了循环结束的地方,但是它(End While)提醒了什么样的语句块将要结束。

这个方法在Return语句处退出。这个算法返回了一个数值,所以这个Return语句表明了该算法应该返回哪个值。如果这个算法没有返回任何数值,例如,如果其目的是排列数值或者建立一个数据结构,那么Return语句执行后就没有任何返回值。

这个例子中的伪代码非常接近于实际的编程代码。其他的例子可能包含自然语言描述的指令和数值,这种情况下,指令用尖括号(< >)括起来,以表示需要把这些自然语言形式的指令翻译成程序代码。

通常,当声明一个参数或变量时(在Gcd算法中, 这包括参数a和b以及变量remainder),会在它前面给出数据类型,数据类型后面跟着一个冒号,如Integer: reminder。对于简单的整形循环变量,数据类型可能会被省略,如For i = 1 To 10。

伪代码不同于某些编程语言的另一个特点是它的For循环可能包含一个Step语句,用以表明循环变量每个循环后改变的数值。For循环以Next i语句结尾(i是循环变量),用来提醒你哪一个循环结束了。

例如,请思考下列的伪代码:

训练CNN 伪代码 伪代码基础_训练CNN 伪代码_02

本书中用的伪代码使用If-Then-Else语句、Case语句和其他需要的语句。从对于真正编程语言的了解来看,读者应该很熟悉这些语句。伪代码需要的别的东西都用英语阐明。

链表(List)是一个对你来说可能不熟悉的基础数据结构。链表类似于一个自我扩展的数组。它提供了一个Add方法让用户向链表的末尾添加元素。下面的伪代码建立了一个包含数字1到10的整数链表:

训练CNN 伪代码 伪代码基础_数据结构与算法_03

在链表被初始化之后,伪代码可以像普通数组一样使用它并从链表的任意位置获取元素。与数组不同的是,链表也允许你在任何位置添加或删除元素。

本书中的许多算法被写成返回一个结果的方法或函数。方法声明的开头是结果的数据类型。如果一个方法执行了一些任务而没有返回一个结果,那么它就没有数据类型。

下列的伪代码包含了两个方法:

训练CNN 伪代码 伪代码基础_链表_04

DoubleIt方法接受一个整数作为参数然后返回了一个整数值,这段代码加倍了输入值并返回了结果。
DoSomething方法接受一个叫做value的整数数组作为参数,它执行了一个任务但是没有返回结果。例如,它可能会随机化或排列数组中的元素。(注:本书假定数组从下标0开始。例如,一个有三个元素的数组有下标0、1、2。)
伪代码应该是很直观并易于理解的,但是如果你发现一些无法理解的东西,请在这本书的讨论论坛上发帖提出问题或者发送邮件到RodStephens@CSharpHelper.com,我会给你指出正确的方向。
伪代码存在一个问题:没有任何编译器来检测错误。作为对基础算法的检测,本书同时给你一些实际的代码作为参考,C#实现的算法和许多练习可以在本书的网站上下载。