【问题标题】:Standards for pseudo code? [closed]伪代码的标准? [关闭]
【发布时间】:2011-01-19 02:16:03
【问题描述】:

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

  • 一致
  • 简单易懂
  • 不要太冗长
  • 不太接近自然语言
  • 不太接近某些具体的编程语言。

如何编写伪代码?有什么标准建议吗?

【问题讨论】:

    标签: pseudocode


    【解决方案1】:

    我建议查看“算法简介”一书(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:是的,但是伪代码完全是关于抽象的——隐藏不必要的细节。在上面的例子中,第 6 行说 u 将统一到 S 上,它是如何实现的有什么关系?
    • 细说Eli Bendersky:不光是如何实现的细节不重要,而且由于这是伪代码,你甚至都不知道它是如何实现的!
    【解决方案2】:

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

    【讨论】:

    • 就我个人而言,这个伪代码是我最喜欢的,它看起来像是基于谓词逻辑,但代码控制的符号非常简洁。我喜欢它,它看起来很整洁。
    【解决方案3】:

    我建议你看看Fortress Programming Language

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

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

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

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

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

    【讨论】:

    • 我觉得你认为这是一个清晰而简单的语法很有趣。 := 和 = 有什么区别?下标“max”是作为运算符还是只是符号?伪代码应该是你可以向非专业人士解释的东西。
    【解决方案4】:

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

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

    • 使用 UML 类图来描述类/继承
    • 使用 UML 序列图来描述代码序列

    【讨论】:

    • 它主要是程序性的,但是您对使用 UML 进行 OO 是正确的。感谢您的提示。
    【解决方案5】:

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

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

    【讨论】:

    • 我大体上同意,尽管我认为 python 确实有一些对于不了解该语言的人可能无法立即理解的东西。一个例子是列表、字典和元组的表示法,即“{}”很可能被视为一个空数组而不是映射结构。
    【解决方案6】:

    在涉及数学和技术领域时,Pascal 历来与伪代码最相似。我不知道为什么,总是这样。

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

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

    【讨论】:

      【解决方案7】:

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

      “算法简介”一书(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) 
      

      如果你不能简单地解释它,那么你就理解得不够好。 - 爱因斯坦

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-24
        • 2010-11-29
        • 2014-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多