トラック2・🧭プログラミング的思考

アルゴリズム——手順を組み立てる

読む目安 約12分・ゴール:アルゴリズムの条件を理解し、順次・分岐・反復の3つの型で手順を組み立てられる

アプリでこのトピックを学ぶ(無料・登録不要)

このトピックの要点

分解して、パターンを見つけて、抽象化する。ここまでで材料は揃いました。最後の道具は、それらを動く順番に組み立てることです。この組み立てた手順をアルゴリズムと呼びます。

アルゴリズムと呼べる条件

ただの思いつきの手順とアルゴリズムを分けるのは、次の3つです。

  1. 明確 — どの手順も、解釈のブレなく実行できる
  2. 有限 — いつか必ず終わる(永遠に続く手順はアルゴリズムではない)
  3. 入力と出力がある — 何を受け取って何を返すかがはっきりしている

「良い感じに並べる」は明確ではないので失格。「1から順に数を足し続ける」は終わらないので失格です。

手順は3つの型でできている

驚くことに、どんなに複雑なプログラムも、次の3つの組み合わせだけで書けます(構造化定理と呼ばれる有名な事実です)。

たった3つです。C言語の if も for も while も、この3つの型に名前を付けたものにすぎません。

師範道具は3つでよい。組み合わせが無限なのじゃ。

日常にもこの3つしかない

朝の支度で確かめてみましょう。「顔を洗う→歯を磨く」は順次。「雨が降っていれば傘を持つ」は分岐。「かばんに必要なものが全部入るまで詰める」は反復です。私たちは無意識にこの3つを組み合わせて生活しています。プログラミングが特別な才能を必要としないと言われるのは、この意味においてです。

ちなみにアルゴリズムという言葉は、9世紀の数学者アル=フワーリズミーの名に由来します。1000年以上前から、人は「誰がやっても同じ答えにたどり着く手順」を大切にしてきたわけです。

例: 一番背の高い人を見つける

10人が並んでいます。一番背が高い人を見つける手順を組み立ててみましょう。人間なら一目で分かりますが、一度に1人しか見られないという制約でやってみます(これが機械の見え方です)。

  1. 最初の人を「暫定1位」として覚える
  2. 次の人を見る
  3. その人が暫定1位より高ければ、暫定1位を入れ替える
  4. 最後の人まで、2と3を繰り返す
  5. 最後に残った暫定1位が答え

順次(1)・反復(4)・分岐(3)が全部入っています。しかもこの手順は、10人でも1万人でもそのまま通用します。手順が人数に依存しない——これが良いアルゴリズムの手ざわりです。

覚えておきたい癖

手順を作ったら、必ず「例外」を確認してください。

この端っこの場合を考える癖が、のちにバグの数を大きく減らします。プロと初心者の差が最も出るのは、実はここです。手順を作ったら「0個のとき」「1個だけのとき」「全部同じとき」の3つを当ててみる。習慣にする価値のある確認です。

アプリでこのトピックを学ぶ(無料・登録不要)

確認問題

確認問題 1

アルゴリズムと呼べる手順の条件として、当てはまらないものはどれでしょう。

  1. どの手順も、解釈のブレなく実行できること
  2. いつか必ず終わること
  3. 何を受け取り、何を返すかがはっきりしていること
  4. できるだけ短い手順であること
答えを見る

正解:D(できるだけ短い手順であること)

短いに越したことはありませんが、それは条件ではありません。条件は「明確」「有限」「入力と出力がある」の3つです。長くても、曖昧さがなく必ず終わるなら立派なアルゴリズムです。

確認問題 2

並んでいる人の中から一番背の高い人を見つける手順です。ただし、一度に1人しか見ることができません。正しい順に並べ替えましょう。

その人が暫定1位より背が高ければ、暫定1位を入れ替える
最初の人を「暫定1位」として覚える
最後の人まで、上の2つを繰り返す
次の人を見る
残った暫定1位を答えとして返す
答えを見る

正しい順番:

最初の人を「暫定1位」として覚える
次の人を見る
その人が暫定1位より背が高ければ、暫定1位を入れ替える
最後の人まで、上の2つを繰り返す
残った暫定1位を答えとして返す

まず比較の基準(暫定1位)を用意しないと、比べる相手がいません。次に「見る→比べて入れ替える」を全員ぶん繰り返し、最後に残ったものが答えです。順次・分岐・反復の3つの型が全部入っており、人数が10人でも1万人でもそのまま通用します。

「プログラミング的思考」の目次

  1. 問題を分解する(Decomposition)
  2. パターンを見つける(Pattern Recognition)
  3. 抽象化——捨てる勇気
  4. アルゴリズム——手順を組み立てる
  5. 擬似コードで書いてみる
  6. フローチャート入門
  7. 日常の問題をアルゴリズム化する
  8. 良い手順・悪い手順——効率の予感

もっと先へ:ポインタ・メモリ・ファイル入出力・セキュアコーディングを含む全26トラックと、段位検定・模試のフルセットは完全版に収録しています。

完全版の販売ページは準備中です。

ほかのトラック

📚 姉妹教材:手を動かして覚える Linux 教材 — Linuxとインフラの仕組みを地図で学ぶ

Web版