伪代码的标准是什么?

33
我需要为我的硕士论文将一些Python和Java例程翻译成伪代码,但我遇到了一些问题,无法想出一个具有以下特点的语法/风格:
  • 一致性
  • 易于理解
  • 不过于冗长
  • 不要过于接近自然语言
  • 不要过于接近某种具体的编程语言。
如何编写伪代码?是否有任何标准建议?
7个回答

21
我建议看一下《算法导论》这本书(作者是Cormen、Leiserson和Rivest)。我总是发现它对算法的伪代码描述非常清晰和一致。
一个例子:
DIJKSTRA(G, w, s)
1  INITIALIZE-SINGLE-SOURCE(G, s)
2  S ← Ø
3  Q ← V[G]
4  while Q ≠ Ø
5      do u ← EXTRACT-MIN(Q)
6         S ← S ∪{u}
7         for each vertex v ∈ Adj[u]
8             do RELAX(u, v, w)

需要将代码抽象化到很高的程度,但是没错——我想这就是我需要的。谢谢。 - ferdystschenko
2
@ferdystschenko:是的,但伪代码都是关于抽象化-隐藏不必要的细节。在上面的例子中,第6行说u将被统一到S上,它如何实现又有什么关系呢? - Eli Bendersky
3
进一步说,就像Eli Bendersky所说,不仅实现的细节不重要,而且由于这是伪代码,您甚至不知道它是如何实现的! - Peter Di Cecco

7
回答自己的问题,我只是想引起对TeX FAQ条目Typesetting pseudocode in LaTeX的关注。它描述了许多不同的样式,列出了优点和缺点。顺便说一下,有两种样式表可用于以"Cormen算法导论"中使用的方式编写伪代码,如上所述:newalgclrscode。后者是Cormen本人编写的。

个人而言,这段伪代码是我最喜欢的,它看起来像基于谓词逻辑,但具有非常干净的代码控制符号。我喜欢它,它看起来整洁。 - Marnix v. R.

5
我建议您看一下Fortress编程语言
这是一种实际的编程语言,而不是伪代码,但它的设计旨在尽可能接近可执行的伪代码。特别地,为了设计语法,他们阅读和分析了数百篇计算机科学和数学论文、课程、书籍和期刊,以寻找伪代码和其他计算/数学符号的常见使用模式。
您可以通过查看Fortress源代码并抽象出不需要的内容来利用所有这些研究成果,因为您的目标受众是人类,而Fortress的目标受众是编译器。
以下是从NASA高级超级计算共轭梯度并行基准测试中运行Fortress代码的实际示例。为了获得有趣的体验,将基准测试的规范与Fortress中的实现进行比较,并注意两者之间几乎存在1:1的对应关系。还可以将其与其他语言(如C或Fortran)的实现进行比较,并注意它们与规范完全无关(通常也比规范长一个数量级)。
我必须强调:这不是伪代码,这是真正可运行的Fortress代码!来自https://umbilicus.wordpress.com/2009/10/16/fortress-parallel-by-default/ 请注意,Fortress是用ASCII字符编写的;特殊字符由格式化程序呈现。

6
你认为这是一种清晰简单的语法,我觉得很有趣。":="和"="有什么区别?下标"max"是作为操作符还是只是符号?伪代码应该是可以向非专业人士解释的东西。 - Frank Krueger

4
如果代码是过程化的,通常伪代码可能很容易(维基百科有一些例子)。
面向对象的伪代码可能更加困难。考虑:
- 使用UML类图来描述类/继承关系 - 使用UML序列图来描述代码的顺序

它大多是过程性的,但你关于使用UML进行面向对象编程的想法是正确的。感谢你的提示。 - ferdystschenko

3

我不理解你对“不要太接近某些具体的编程语言”的要求。

Python通常被认为是编写伪代码的良好选择。也许一个略微简化的Python版本适合您。


1
我基本上同意,尽管我认为Python有一些东西可能对于没有语言知识的人来说不是立即可理解的。一个例子是列表、字典和元组的符号表示,即'{}'可能被视为一个空数组而不是映射结构。 - ferdystschenko

2

在数学和技术领域中,Pascal一直是传统上最接近伪代码的语言。我不知道为什么,它就是这样。

我有一些关于这个理论的书(哦,我不知道,可能有10本)放在书架上。

Python可以是一种很好的编程语言,但有时也会变得难以阅读,这真是奇怪。老的编程语言更难以变得难以阅读——因为它们相对“简单”(谨慎地看待),比今天的语言要简单。它们可能更难以理解程序正在做什么,但更容易阅读(需要更少的语法/语言特性来理解程序的功能)。


2

这篇文章有些陈旧,但希望对其他人有所帮助。

《算法导论》(Cormen、Leiserson 和 Rivest 合写)是一本关于算法的好书,但其“伪代码”令人困惑。如 Q[1...n] 这样的记法并不清晰,需要在“伪代码”之外进行说明。此外,像《算法导论》这样的书籍喜欢使用数学语法,这违反了伪代码的一个目的。

伪代码应该做到两件事:抽象掉语法和易于阅读。如果实际代码比伪代码更具描述性,则它就不是伪代码。

假设你要编写一个简单的程序。

屏幕设计:

Welcome to the Consumer Discount Program!
Please enter the customers subtotal: 9999.99
The customer receives a 10 percent discount
The customer receives a 20 percent discount
The customer does not receive a discount
The customer's total is: 9999.99

变量列表:
TOTAL:         double
SUB_TOTAL:     double
DISCOUNT:      double

伪代码:

DISCOUNT_PROGRAM

    Print "Welcome to the Consumer Discount Program!"
    Print "Please enter the customers subtotal:"
    Input SUB_TOTAL

    Select the case for SUB_TOTAL
        SUB_TOTAL > 10000 AND SUB_TOTAL <= 50000
            DISCOUNT = 0.1
            Print "The customer receives a 10 percent discount"
        SUB_TOTAL > 50000
            DISCOUNT = 0.2
            Print "The customer receives a 20 percent discount"
        Otherwise
            DISCOUNT = 0
            Print "The customer does not a receive a discount"

    TOTAL = SUB_TOTAL - (SUB_TOTAL * DISCOUNT)
    Print "The customer's total is:", TOTAL

请注意,这段文字非常易读,不涉及任何语法。它支持Bohm和Jacopini的三种控制结构。
序列:
Print "Some stuff"
VALUE = 2 + 1
SOME_FUNCTION(SOME_VARIABLE)

选择:

if condition
    Do one extra thing

if condition
    do one extra thing
else
    do one extra thing

if condition
    do one extra thing
else if condition
    do one extra thing
else
    do one extra thing

Select the case for SYSTEM_NAME
    condition 1
        statement 1
    condition 2
        statement 2
    condition 3
        statement 3
    otherwise
        statement 4

重复:
while condition
    do stuff

for SOME_VALUE TO ANOTHER_VALUE
    do stuff

将其与此 N皇后问题的“伪代码”(https://en.wikipedia.org/wiki/Eight_queens_puzzle)进行比较:

PlaceQueens(Q[1 .. n],r)

    if r = n + 1
        print Q
    else
        for j ← 1 to n
            legal ← True
            for i ← 1 to r − 1
                if (Q[i] = j) or (Q[i] = j + r − i) or (Q[i] = j − r + i)
                    legal ← False
        if legal
            Q[r] ← j
            PlaceQueens(Q[1 .. n],r + 1) 

如果你不能简单地解释它,那么你对它的理解还不够深刻。- 阿尔伯特·爱因斯坦

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接