---
tags: [算法分析与设计]
abstract: 伪代码规范、变量、参数传递与算法表达
finished: false
上一篇: [[计算机系/算法分析与设计/01 算法入门与正确性证明|上一篇]]
下一篇: [[计算机系/算法分析与设计/03 运行时间与渐进分析|下一篇]]
返回目录: [[计算机系/算法分析与设计/算法分析|算法分析与设计学习指南]]
前置知识: [[计算机系/算法分析与设计/01 算法入门与正确性证明|前置知识]]
---
# 伪代码与算法表达

## 伪代码

- 在伪代码中，每一条指令占一行(else if 例外)，指令后不跟任何符号；
- “缩进”表示程序中的分支程序结构（缩进表示块结构；同一模块的语句有相同的缩进量，次一级模块的语句相对与其父级模块的语句缩进）；     
- 通常每个算法开始时都要描述它的输入和输出，而且算法中的每一行都给编上行号，在解释算法的过程中会经常使用算法步骤中的行号来指代算法的步骤；
- 每一行可以加上编号（也可不加）。

**1.变量的声明**

算法中出现的数组、变量可以是以下类型：整数、实数、字符、字符串或指针。定义变量的语句不用写出来，但必须在注释中给出。

伪代码程序中的变量都是局部变量。在没有显式说明的情况下，不使用全局变量

通过数组名\[下标]的形式访问数组元素，伪代码中一般使用 1 作为第一个元素下标，但高级语言中一般使用 0 作为第一个元素下标。

用符号“..” 来表示数组中的一个取值范围。A\[1...j]就表示A\[1]..A\[j]

也就是说，对于A\[i:j],算法导论中有j-i+1个元素

而python中，却是只有j-i个元素，算法导论是从1开始，python从0开始，实质上没有区别

 
基本语法约定

- **对象**可以由一组属性构成。
- 伪代码中的函数参数默认采用**按值传递**。
- 多重赋值 `i <- j <- e` 表示先计算 `e`，再把结果赋给 `j` 和 `i`，等价于：

  ```
  j <- e
  i <- j
  ```

  在结果相同的前提下，也可以理解为 `i = j = e`。
- 变量（如 `i`、`j` 和 `key`）默认是给定过程的**局部变量**。除非明确声明，否则不使用全局变量。
- 布尔运算符 `and` 和 `or` 都采用**短路求值**：`and` 的左操作数为假时不再计算右侧，`or` 的左操作数为真时不再计算右侧。
- 关键词 `error` 表示调用过程的方式不正确，或过程执行过程中出现错误。


 返回值

执行 `return` 后，程序返回函数的调用点。本伪代码约定允许返回多个值。C++ 等语言通常通过结构体、元组、数组、引用参数或指针参数实现多个结果的返回；伪代码直接支持多返回值。



**2.指令的表示**

在算法中的某些指令或子任务可以用文字来叙述，例如，”设x是A中的最大项”，这里A是一个数组；或者”将x插入L中”，这里L是一个链表。这样做的目的是为了避免因那些与主要问题无关的细节使算法本身杂乱无章。

**3.表达式**

算术表达式可以使用通常的算术运算符（+，-，\*，/，以及表示幂的^）。逻辑表达式可以使用关系运算符 = 、≠、<、>、≤ 和 ≥，以及逻辑运算符与(and)、或（or）、非（not）。

**4.赋值语句**

赋值语句是如下形式的语句：a←b 。或者sum=0；
 这里a是变量、数组项，b是算术表达式、逻辑表达式或指针表达式。语句的含义是将b的值赋给a。

变量交换：若a和b都是变量、数组项，那么记号a<->b 表示a和b的内容进行交换。

**5.goto语句**

goto语句具有形式：

goto label（goto标号）

它将导致转向具有指定标号的语句。

**6.分支结构 if then else**

条件语句：

if i=10

  then xxxx

  else xxxx //else 和 then 要对齐

   

//或者

if i=10

  then xxxx //if 后面必定跟上then，else后面不用跟then

  elseif i=9 //elseif 要连在一起写

​    then xxxx

​    yyyy

  else xxxx //else 跟在 elseif 的 then 对齐

**7.循环结构**

有两种循环指令：while和for、repeat

while语句的形式是：

while time<10

  do xxxxx //while后面必定要紧跟缩进的do

  xxxxx

  end

for语句的形式是：

for var init to limit by incr 

​    do s

end

这里var是变量，init、limit和incr都是算术表达式，而s是由一个或多个语句组成的语句串。初始时，var被赋予init的值。假若incr≥0，则只要var≤limit，就执行s并且将incr加到var上。（假若incr<0，则只要var≥limit，就执行s并且将incr加到var上）。incr的符号不能由s来该改变。

For i=1 to n

**8.程序的结束**

exit语句可以在通常的结束条件满足之前，被用来结束while循环或者for循环的执行。exit导致转向到紧接在包含exit的（最内层）while或者for循环后面的一个语句。

return用来指出一个算法执行的终点；如果算法在最后一条指令之后结束，它通常是被省略的；它被用得最多的场合是检测到不合需要的条件时。return的后面可以紧接被括在引号的信息。

**9.注释风格**

算法中的注释被括在 //或者/* \*/ 之中。或者是“▷”

**10.函数的编写**

函数的伪代码格式例子为：search（A，name）， 参数类型可以不给出，但必须在注释中说明。

**11.复合数据**

复合数据一般组织成对象，它们是由属性或域所组成的，每个属性（域）存储特定的值。这些属性可以是数据（数字、字符串、数组），也可以是函数（方法），它们最终对应特定的值。访问对象的属性/域的访问是由域（属性）名后跟由方括号的对象名形式来表示。例如：数组可以被看做是一个对象，其属性有length，表示数组中元素的个length\[A]。

**什么是“域的访问”？**

所谓“访问”，就是**取出（读取）或修改**对象中的某个属性。

在伪代码中，访问语法可能会这样写：

`name[person]  // 表示“访问person对象的name属性”`

相当于其他语言中更常见的写法：


```js
person.name // JavaScript语法

person["name"] // 等价写法
```

 
用于表示一个对象的变量被看作是指向该对象的一个指针。这样，多个变量指向同一个对象，修改一个会影响另一个

 
