web-dev-qa-db-ja.com

擬似コードの標準?

いくつかのpythonおよびJavaルーチンを修士論文の疑似コードに変換する必要がありますが、次のような構文/スタイルを思い付くのに問題があります。

  • 一貫性がある
  • わかりやすい
  • 冗長すぎない
  • 自然言語に近すぎない
  • いくつかの具体的なプログラミング言語に近すぎない。

擬似コードをどのように記述しますか?標準的な推奨事項はありますか?

28
ferdystschenko

「アルゴリズム入門」の本(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)
19
Eli Bendersky

私自身の質問に答えて、私はTeX FAQ entry LaTeXのタイプセット擬似コード に注意を向けたいと思いました。それは多くの異なるスタイルを説明し、長所と短所をリストします。ちなみに、上記で推奨されているように、Cormenによる「Introductinto Algorithms」で使用されている方法で擬似コードを記述するための、newalgclrscodeの2つのスタイルシートがあります。後者はCormen自身によって書かれました。 。

7
ferdystschenko

Fortressプログラミング言語 をご覧になることをお勧めします。

これは実際のプログラミング言語であり、not擬似コードですが、実行可能な擬似コードにできるだけ近くなるように設計されています。特に、構文を設計するために、彼らはCSや数学の論文、コース、本、ジャーナルを数百読んで分析し、擬似コードの一般的な使用パターンを見つけました。他の計算/数学表記。

Fortressのソースコードを見て、必要のないものを抽象化するだけで、そのすべての調査を活用できます。ターゲットオーディエンスは人間であるのに対し、Fortressはコンパイラです。

これは、 NAS(NASA Advanced Supercomputing)Conjugate Gradient Parallel Benchmark からFortressコードを実行するactualの例です。楽しい経験のために、ベンチマークの仕様実装と比較してください要塞で、ほぼ1:1の対応があることに注意してください。また、CやFortranなどの他のいくつかの言語での実装を比較し、それらが仕様とはまったく関係がないことに注目してください(また、多くの場合、仕様よりも桁違いに長くなっています)。

強調する必要があります:これは擬似コードではなく、実際に機能する要塞コードです! 要塞コードの例http://ProjectFortress.Sun.Com/Projects/Community/raw-attachment/wiki/FortressQuestions/NAS-CG.png

編集:上記のコード例のリンクは無効です。おそらく同様の例がここにあります: https://umbilicus.wordpress.com/2009/10/16/fortress-parallel-by-default/

5
Jörg W Mittag

コードが手続き型の場合、通常の擬似コードはおそらく簡単です(ウィキペディアにはいくつかの例があります)。

オブジェクト指向の擬似コードはもっと難しいかもしれません。考えてみましょう:

  • uMLクラス図を使用してクラス/継承を表現する
  • uMLシーケンス図を使用してコードのシーケンスを表現する
4
Patrick

「具体的なプログラミング言語に近すぎない」というあなたの要件を理解していません。

Pythonは一般に、擬似コードを作成するための適切な候補と見なされています。おそらく、pythonの少し簡略化されたバージョンがあなたのために働くでしょう。

3
Olivier Verdier

Pascalは、数学および技術分野に関しては、常に従来から擬似コードに最も類似しています。理由はわかりませんが、いつもそうだったのです。

私はいくつか持っています(ああ、私は知りません、おそらくこの理論を具体化する棚に10冊の本があります)。

提案されているように、Pythonは素晴らしいコードである可能性がありますが、それ自体が不思議であるほど読みにくい場合もあります。古い言語は読みにくくするのが難しく、今日の言語よりも「単純」(注意が必要)です。何が起こっているのかを理解するのは難しいかもしれませんが、読みやすくなります(プログラムの機能を理解するために必要な構文/言語機能が少なくなります)。

2
Rook

この投稿は古いですが、うまくいけば、これは他の人を助けるでしょう。

「アルゴリズム入門」の本(Cormen、Leiserson、Rivestによる)はアルゴリズムについて読むのに良い本ですが、「擬似コード」はひどいものです。 Q [1 ... n]のようなものは、Q [1 ... n]が何を意味するのかを理解する必要がある場合には意味がありません。これは「擬似コード」の外で注意する必要があります。さらに、「アルゴリズム入門」のような本は、擬似コードの1つの目的に違反する数学的構文を使用するのが好きです。

擬似コードは2つのことを行う必要があります。構文から離れて抽象化し、読みやすくします。実際のコードが擬似コードよりも記述的であり、実際のコードがより記述的である場合、それは擬似コードではありません。

簡単なプログラムを書いていたとしましょう。

画面デザイン:

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

これは非常に読みやすく、構文を参照していないことに注意してください。これは、ボームとジャコピーニの3つの制御構造すべてをサポートします。

シーケンス:

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) 

簡単に説明できないと、十分に理解できません。 - アルバート・アインシュタイン

0
user3133566