31

我需要将一些 python 和 java 例程翻译成我的硕士论文的伪代码,但在提出以下语法/样式时遇到了麻烦:

  • 持续的
  • 容易理解
  • 不太冗长
  • 不太接近自然语言
  • 不太接近一些具体的编程语言。

你怎么写伪代码?有什么标准推荐吗?

4

7 回答 7

20

我建议查看“算法简介”一书(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)
于 2010-02-20T10:03:51.117 回答
7

回答我自己的问题,我只是想提请注意 TeX 常见问题解答条目Typesetting pseudocode in LaTeX。它描述了许多不同的样式,列出了优点和缺点。顺便说一句,正如上面推荐的那样,有两个样式表用于以 Cormen 在“算法介绍”中使用的方式编写伪代码:newalgclrscode. 后者是科门自己写的。

于 2010-02-25T14:08:06.507 回答
5

我建议你看看Fortress Programming Language

这是一种实际的编程语言,而不是伪代码,但它被设计为尽可能接近可执行伪代码。特别是,为了设计语法,他们阅读并分析了数百篇 CS 和数学论文、课程、书籍和期刊,以找到伪代码和其他计算/数学符号的常见使用模式。

您可以通过查看 Fortress 源代码并抽象出您不需要的东西来利用所有这些研究,因为您的目标受众是人类,而 Fortress 是一个编译器。

这是从NAS(NASA 高级超级计算)共轭梯度并行基准运行 Fortress 代码的实际示例。为了获得有趣的体验,请将基准的规范与 Fortress 中的实现进行比较,并注意几乎是 1:1 的对应关系。还要比较其他几种语言的实现,如 C 或 Fortran,并注意它们与规范完全无关(而且通常比规范长一个数量级)。

我必须强调:这不是伪代码,这是实际工作的堡垒代码!来自https://umbilicus.wordpress.com/2009/10/16/fortress-parallel-by-default/

共轭梯度的堡垒代码示例

注意 Fortress 是用 ASCII 字符写的;特殊字符使用格式化程序呈现。

于 2010-02-20T14:33:29.763 回答
4

如果代码是程序性的,普通的伪代码可能很容易(维基百科有一些例子)。

面向对象的伪代码可能更难。考虑:

  • 使用 UML 类图来描述类/继承
  • 使用UML序列图来描述代码序列
于 2010-02-20T10:05:48.507 回答
3

我不明白您对“不太接近某种具体的编程语言”的要求。

Python 通常被认为是编写伪代码的良好候选者。也许稍微简化的 python 版本对你有用。

于 2010-02-20T14:39:39.013 回答
2

在涉及数学和技术领域时,Pascal 一直是传统上与伪代码最相似的。不知道为什么,总是这样。

我有一些(哦,我不知道,书架上可能有 10 本书,具体体现了这个理论)。

正如所建议的那样,Python 可以是很好的代码,但它也可能如此难以理解,它本身就是一个奇迹。较旧的语言更难让人难以理解——它们比今天的语言“更简单”(谨慎使用)。它们可能更难理解正在发生的事情,但更容易阅读(理解程序的功能需要更少的语法/语言特性)。

于 2010-02-20T15:15:33.960 回答
1

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

“算法简介”一书(Cormen、Leiserson 和 Rivest 合着)是一本关于算法的好书,但“伪代码”很糟糕。当人们需要理解 Q[1...n] 的含义时,像 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-Queens “伪代码”(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) 

如果你不能简单地解释它,你就理解得不够好。- 艾尔伯特爱因斯坦

于 2019-01-11T15:02:22.433 回答