56  擬似コード

ヒント学習目標
  • 代入、選択構造、反復構造を理解する。
  • 簡単なアルゴリズムを擬似コードで表現できる。

アルゴリズムは、さまざまな方法で表現できる。代表的な方法には、フローチャート、擬似コードがある。

擬似コード(Pseudocode)は、アルゴリズムを記述するための表記法である。厳密な構文はないが、自然言語より明確にアルゴリズムを表現できる。ここでは、曖昧さのない一般的に使われる擬似コードの表記法を紹介する。

56.1 代入

代入(assignment)とは、変数に値を設定する操作である。代入の擬似コードは以下の通りである。

\[ \texttt{variable} \gets \texttt{expression} \]

\(\texttt{variable}\)は変数、\(\texttt{expression}\)は値や式を表す。記号\(\gets\)は「代入」を意味する。プログラミング言語では、代入は通常=記号で表現される。

例えば、利益は収入からコストを引いた値と定義される。これを擬似コードで表現すると以下のようになる。

\[ \texttt{profit} \gets \texttt{revenue} - \texttt{cost} \]

以下は、Pythonでの実装例を示す。

revenue = 1000
cost = 600
profit = revenue - cost
print(profit)
ノート実行してみよう

PythonはGoogle Colabの環境で簡単に実行できる。以下の手順で試してみよう。

  1. Google Colabにアクセスする。
  2. 「新しいノートブック」をクリックする。
  3. 上記のコードをコピーして、セルに貼り付ける。
  4. セルを実行する。

C言語での実装例は以下の通りである。

#include <stdio.h>
int main() {
    int revenue = 1000;
    int cost = 600;
    int profit = revenue - cost;
    printf("%d\n", profit);
    return 0;
}

56.2 選択構造

選択構造(selection structure)は、条件に基づいて異なる処理を実行するための構造である。擬似コードでは、以下のように表現される。

\begin{algorithm} \begin{algorithmic} \If{condition} \State activity \Else \State activity \EndIf \end{algorithmic} \end{algorithm}

読みやすくするために、擬似コードでは、字下げを用いて制御範囲を示す。Pythonなどのプログラミング言語では、字下げが構文の一部であるため、特に重要である。

conditionは条件式で、結果はTrueまたはFalseである。条件がTrueの場合、then以下の処理が実行され、Falseの場合はelse以下の処理が実行される。

例えば、成績を判定するアルゴリズムは以下のように表現できる。

\begin{algorithm} \begin{algorithmic} \If{score >= 60} \State result $\gets$ "Pass" \Else \State result $\gets$ "Fail" \EndIf \end{algorithmic} \end{algorithm}

以下は、PythonとC言語での実装例である。

score = 75
if score >= 60:
    result = "Pass"
else:
    result = "Fail"
print(result)
#include <stdio.h>
int main() {
    int score = 75;
    char result[10];
    if (score >= 60) {
        sprintf(result, "Pass");
    } else {
        sprintf(result, "Fail");
    }
    printf("%s\n", result);
    return 0;
}

56.3 反復構造

反復構造(repetition structure)は、特定の条件が満たされるまで同じ処理を繰り返すための構造である。擬似コードでは、以下のように表現される。

\begin{algorithm} \begin{algorithmic} \While{condition} \State activity \EndWhile \end{algorithmic} \end{algorithm}

例えば、1からnまでの整数の合計、\(\sum_{i=1}^{n} i\)を計算するアルゴリズムは以下のように表現できる。

\begin{algorithm} \begin{algorithmic} \State $\texttt{sum} \gets 0$ \State $\texttt{i} \gets 1$ \While{$\texttt{i} \leq \texttt{n}$} \State $\texttt{sum} \gets \texttt{sum} + \texttt{i}$ \State $\texttt{i} \gets \texttt{i} + 1$ \EndWhile \end{algorithmic} \end{algorithm}

以下は、PythonとC言語での実装例である。

n = 10
sum = 0
i = 1
while i <= n:
    sum += i
    i += 1
print(sum)
#include <stdio.h>
int main() {
    int n = 10;
    int sum = 0;
    int i = 1;
    while (i <= n) {
        sum += i;
        i++;
    }
    printf("%d\n", sum);
    return 0;
}

反復構造は、よく一連のデータを順番に処理する場合に使用される。このような処理に対し、for-eachという構造を用いることもある。擬似コードでは、以下のように表現される。

\begin{algorithm} \begin{algorithmic} \ForAll{item \textbf{in} collection} \State activity \EndFor \end{algorithmic} \end{algorithm}

例えば、[1, 2, 3, 4, 5]というリストの各要素の2乗を計算するpythonのコードは以下のようになる。

numbers = [1, 2, 3, 4, 5]

for number in numbers:
    square = number ** 2
    print(square)

56.4 練習問題

練習 56.1 (最大値を求める) 3つの整数を入力として受け取り、その中で最大の値を出力するアルゴリズムを擬似コードで表現し、任意のプログラミング言語で実装しなさい。

解答 56.1. 擬似コードの解答例は省略。

def find_maximum(x1, x2, x3):
    x_max = x1
    if x2 > x_max:
        x_max = x2
    if x3 > x_max:
        x_max = x3
    return x_max
#include <stdio.h>
int find_maximum(int x1, int x2, int x3) {
    int x_max = x1;
    if (x2 > x_max) {
        x_max = x2;
    }
    if (x3 > x_max) {
        x_max = x3;
    }
    return x_max;
}