伪代码是一种混合使用编程结构、自然语言和数学符号来描述算法的方式。在计算机科学中,它用于传达计算的步骤,而不必遵守某种特定编程语言的精确规则。它的预期读者通常是人,而不是计算机。伪代码介于非正式说明与可执行代码之间,明确展示操作细节,同时省略与所描述算法无关的句法细节。(cs.cornell.edu)
目的与适用范围
伪代码将算法的关键判断和操作与实现细节分离开来。它可以说明需要比较哪些值、重复哪些操作,以及返回什么结果,而无须限定具体的语言或开发环境。当同一算法可能用多种语言实现时,这种语言独立性尤其有用。(cs.utexas.edu)
合适的抽象程度取决于读者和用途。首次介绍一种排序算法时,需要解释其内部步骤;而另一种算法若将排序作为已有的操作来使用,则可以直接调用排序子程序。如果抽象隐藏了理解或分析计算过程所必需的操作,就显得过度。反过来,罗列所有实现细节也可能掩盖核心思想。(cs.cornell.edu)
伪代码也用于软件文档。设计说明可以借助伪代码描述复杂算法,并结合架构决策、边界条件和不变量加以阐释。它记录计算过程如何组织,而不一定照搬最终的源代码。(cs.cornell.edu)
记法与约定
伪代码并不是一种具有统一规定的语言。不同课程、教材和考试体系会根据各自的用途制定约定。有些描述非常接近普通代码,另一些则包含较长的文字指令。例如,剑桥国际发布了指南,为其计算机科学考试规定所用的记法。这类指南定义的是一种特定的方言,而不是所有伪代码都必须遵守的规则。(cs.cornell.edu)
典型的伪代码描述会使用命名变量、赋值、比较和控制流结构。像 count ← count + 1 这样的赋值语句用于更新变量,并不是在断言一个数学等式成立。条件语句用于在不同分支之间作出选择,循环则重复执行一组操作。缩进或明确的结束关键字用于标示哪些语句属于同一组。(cambridgeinternational.org)
常见结构包括:
IF、ELSE及相关形式,用于条件执行。FOR、WHILE和REPEAT,用于迭代。- 带有名称和参数的过程与函数。
RETURN,用于返回函数结果。- 通过索引访问数组(数据结构)或其他数据结构。
- 布尔条件,以及
AND、OR和NOT等运算符。(cambridgeinternational.org)
句法易于阅读,并不意味着可以忽略语义学层面的精确性。描述必须清楚交代会影响结果的约定,包括索引范围、循环的停止条件,以及某项操作是否会修改传入的实参。剑桥的伪代码方言明确区分按值传参与按引用传参。(cambridgeinternational.org)
示例:二分查找
以下示例伪代码描述了在按非递减顺序排列的数组中进行二分查找的过程。索引从零开始,返回值 NOT_FOUND 表示不存在匹配元素。记号 floor 表示向下取整,得到一个整数。算法反复检查剩余搜索区间的中间位置,并排除不可能包含目标值的那一半。(cs.cornell.edu)
BINARY_SEARCH(A, target)
low ← 0
high ← length(A) - 1
WHILE low ≤ high
middle ← low + floor((high - low) / 2)
IF A[middle] = target
RETURN middle
ELSE IF A[middle] < target
low ← middle + 1
ELSE
high ← middle - 1
RETURN NOT_FOUND
在这个版本中,搜索区间包含左右两个端点。对于空数组,循环条件一开始就不成立。如果存在重复值,该过程会返回某个匹配元素的索引,但不保证返回第一次或最后一次出现的位置。这些性质由示例中的初始化、比较和更新方式决定。
该示例省略了特定语言的声明和数组 API,但保留了实现搜索所需的判断。在通过索引访问元素和进行比较均耗费常数时间的假设下,其最坏情况下的时间复杂度随数组长度呈对数增长。通常用大O记号将其表示为 。(cs.cornell.edu)
正确性与分析
伪代码可以提供操作层面的描述,作为组织数学证明的依据。前置条件说明对输入的假设,后置条件说明结果必须满足的要求。断言则描述执行过程中某些特定位置应当成立的性质。这些陈述是对算法的补充,而不是对算法步骤的替代。(cs.cornell.edu)
对于迭代算法,循环不变量将相邻的迭代联系起来。在二分查找中,一个不变量可以表述为:任何可能匹配的元素都仍位于当前搜索区间内。正确性论证需要解释初始化为何能使这一性质成立、每次迭代为何能保持它,以及终止时为何能得到所需结果。证明算法会终止,还需要说明剩余区间会不断缩小。(cs.cornell.edu)
分析关注的是所描述的操作及其假定成本,而不只是代码清单看起来有多长。一条简短的指令可能隐藏大量计算。因此,伪代码必须展示足够的细节,才能进行有意义的计算复杂性分析。(cs.cornell.edu)
教育用途与局限
算法教材使用伪代码介绍各种方法,使读者无须事先掌握某一种实现语言。例如,《算法导论》用英语和伪代码描述算法,其伪代码面向具有一定编程经验的读者。在教学和考核中,共用一套记法也能让读者对各种结构的书写方式形成一致的预期。(mitpress.mit.edu)
仅有伪代码并不足以构成完整的算法说明。麻省理工学院的算法课程指南将算法描述与示例、正确性论证及运行时间分析区分开来。代码清单能够展示执行了哪些操作,却不一定能说明这些操作为何能解决问题,或解决问题的效率如何。(ocw.mit.edu)
参考来源
- CS 341 (Algorithms): Pseudocodecs.cornell.edu
- Algorithmscs.utexas.edu
- CS 4120 Overview Documentation for Programming Assignmentscs.cornell.edu
- Cambridge International AS & A Level 9618 Computer Science Pseudocode Guide for Teachers for examination in 2026cambridgeinternational.org
- Loop invariantscs.cornell.edu
- Analyzing Complexitycs.cornell.edu
- CS2110. Program correctnesscs.cornell.edu
- Introduction to Algorithmsmitpress.mit.edu
- Syllabus: Introduction to Algorithms (SMA 5503)ocw.mit.edu