刚开始学数据结构的时候看不明白这个伪代码到底是个啥,经过一番查阅资料,以下是一些总结与思考~~
能干自己的事儿,也要能向别人表达自己到底在干啥事儿。
原则上,使用伪代码,不用拘泥于具体实现。
相比程序语言(例如 Java, C++,C, Dephi等等),它更类似自然语言,是半角化的、不标准的语言。使用其的目的在于将整个算法运行过程的结构用接近自然语言的形式(可以使用任何一种你熟悉的文字,关键是将程序的意思表达出来)描述出来。
虽然伪代码的写法常常与个人的书写习惯相关,但业内仍有一些约定俗成的词汇和表达方式;这里就一些常见的、容易引起歧义的的表达方式进行了总结和梳理,同时也是我个人伪代码书写习惯的整理。此外,在日后的学习中与项目的沟通中常常也会涉及到成员之间的算法构想的交流,手持一份如此的伪代码规则书,也会使合作流畅许多。
(但其实过度成文的规则到最终都会变成编程语言吧~规则是死的,人是活的。代码是死的,伪代码是活的(偷笑
1.书写规则
可考虑采用类 Pascal 语言的语法规则(即类似 python 取对对齐)。
尽量采用全英文的方式书写(其实统一起来就好?但是感觉用英文书写比较能和其他函数匹配起来~)
注:类 Pascal 语言的伪代码的语法规则是:在伪代码中,每一条指令占一行(else if 除外)。指令后不跟任何符号(Pascal 和 C 中语句要以分号结尾)。书写上的“缩进”表示程序中的分支程序结构。这种缩进风格也适用于 if-then-else 语句。
2.运算
← :赋值
e.g.
x ← x + 1
Meaning:x ++,x += 1,x = x + 1
* :对非向量的多项式——简单相乘;对矩阵、向量:element wise product
e.g.
x ← a * b
Meaning:x = a * b
(np.array[1,3] )M ← (np.array[1,3])A * (np.array[1.3]) B
Meaning:M[i] = A[i] * B[i]
dot:点积(矩阵运算)
e.g.
(np.array[1,3]) M ← (np.array[1,n]) A dot (np.array[n,3]) B
Meaning:M = np.dot(A,B)
/:除法,取完整商的 float 类型
e.g.
a ← /b
Meaning:float a /= b
a ← b / c
Meaning:float a = b/c
div:除法,取商的整数部分
e.g.
a ← div b
Meaning:float a /= b
a ← b div c
Meaning:float a = b/c
%:模,即取余数
3.注释格式
单行注释:#……
跨行注释:##……##
*定义变量的语句不用写出来,但必须在注释中给出。
4.分支、循环
4.1 if else
if …
(elif …)
else …
和 python 里面一样,长执行语句可与 goto + label 搭配,短执行语句可与 switch 搭配或直接搭配短执行语句,便于查询条件、组织逻辑结构;
4.2 do… while/until, while
不建议使用,容易影响正式代码也写成 do while/until,判断先后标准容易造成歧义,在不同的情况下可能会有意料不到的非指针形参,使代码陷入死循环,而且有的语言没有 until这个指令。尽量用 for 循环+if…break/continue/pass 来代替;
4.3 for 循环
①对于 for i in range,一律采用 range[/( a , b ]/),即采用数学中的开闭区间来表示 range范围;对 a 和 b 没有严格的大小要求,如果 b<a,依然意味着(倒序)从 a 开始到 b 之间取 i;
②对于 for I in range,如果对步长等格式有指定,可用注释标明 step = 步长数;如果step = -1,则意味着取倒序;
4.4 max/min
取最大:max{a,b,c} or max{一个数列},取最小类似;
4.5 其他关键词
break, continue, pass 同 python。
即:尽量只采用 for 来描述循环;if/else 结构中尽量把条件放在更近的地方,分支语句采用 goto + label 或 switch 结构进行索引。
其他:
1.通常每个算法开始时都要描述它的输入和输出,而且尽量采用 part / label 等关键字给算法打标签,一边在解释算法的过程中快速索引;
2.定义变量的语句不用写出来,但必须在注释中给出;
3.逻辑表达式可以使用关系运算符 =(或者==,建议用==) 、≠、<、>、≤ 和 ≥,以及逻辑运算符与(and)、或(or)、非(not);
4.涉及到调用未编写的函数,可以直接 call 函数名,然后在注释中解释它的作用(参数、功能、return)
总而言之,伪代码的原则:简洁清晰、易理解、易索引。
参考资料:
https://baike.baidu.com/item/%E4%BC%AA%E4%BB%A3%E7%A0%81/10321865
(百度百科)
https://www.cnblogs.com/linuxAndMcu/p/11242905.html#_label1
https://www.php.cn/csharp-article-415083.html
(他人博客)
以及一些个人经验的总结