伪代码规定
最近博客上的伪代码越写越乱了,是时候好好定一下了。
参考了《算法导论》的伪代码风格,杂揉一些Python的写法。
注释
//后的所有内容都是注释。
1 | // 这是注释 |
变量
以单个字符为主,小写字母可以有多个,大写字母最好只有1个。
变量的属性用.操作符来访问。
这里的变量实际上都是对实体的一个引用,类似于C++中的指针。
1 2 3 4 5 6 7 | a = 1 // 第一次声明a b = 2 // 第一次声明b a = b // a绑定到b上,即a和b指向同一实体 a = COPY(b) // 将b的值复制到a a = DEEPCOPY(b) // 深度复制,将b中所有的引用全部复制。 a.name = "233" // 属性的设定 b.name = a.name // 属性的访问与设定 |
函数
函数的声明以function开始。
函数名称最好全部大写,如果有多个词语用-分开。
函数名后面带一个元组,表示参数。
return语句用来返回函数值。如果没有return,那么实际返回nil。
1 2 3 4 | function ADD-TWO-NUMBERS(a, b):
return a + b
c = ADD-TWO-NUMBERS(1, 2) // c = 3
|
操作符
=: 赋值,在if中表示判断是否相等
<: 小于
>: 大于
<=: 不大于
>=: 不小于
+: 加号
-: 减号
*: 乘号
**: 幂运算
/: 除号
mod: 取模
~: 按位取反
&: 按位与
|: 按位或
^: 按位异或
<<: 按位左移
>>: 按位右移
not: 逻辑反
and: 逻辑且
or: 逻辑或
xor: 逻辑异或
条件控制语句
if
1 2 3 4 5 6 7 8 | if statement:
// 如果为真
else if statement2:
// ...
else if statement3:
// ...
else:
// ...
|
while
1 2 | while condition:
// ...
|
for
for的形式可以多样。条件可以用陈述句。
1 2 | for i = 0 to 100 step 2: // i从0到100,每次加2。
// ...
|
foreach可以以不定的顺序遍历集合内的所有元素。
1 2 | foreach a in A:
// ...
|
对于诸如1到100的遍历,可以使用定义域。
1 2 | foreach i in [1, 100]:
// ...
|
内置类型
nil: 表示不存在的值
Number: 表示实数
String: 表示字符串,用""表示
Boolean: 表示布尔值,只有true和false
Byte: 表示一个字节(通常为8bit),允许使用16进制和2进制,16进制以#开始。
Set: 表示集合,用{}表示。
所有的类型后加上[]表示该类型的数组类型。
对于元组,使用()来表示。
内置函数或语句
ASSERT statement: 断言,如果不为真则报错。
SWAP(a, b): 交换两者的引用。
delete a: 删除a这一引用
以及各种数学函数
元组
使用小括号来声明元组。
1 2 | (a, ) // 如果只有一个元素,则需要带上一个额外的逗号。 (a, b, c) // 三元组 |
元组可以裂解。
1 | a, b = (1, 2) // a = 1, b = 2 |
构成元组的方式也可以随意。
1 | a, b = b, a // 此乃SWAP的实现 |
如果遇到极端情况…
如果上面的规定不能满足表达算法的需要,那么有两种解决方法:
- 从其它的语言借点语法过来,别人看得懂就行。
- 使用陈述句。
记住,如果解决不了时,就用陈述句。