分解して、パターンを見つけて、抽象化する。ここまでで材料は揃いました。最後の道具は、それらを動く順番に組み立てることです。この組み立てた手順をアルゴリズムと呼びます。
アルゴリズムと呼べる条件
ただの思いつきの手順とアルゴリズムを分けるのは、次の3つです。
- 明確 — どの手順も、解釈のブレなく実行できる
- 有限 — いつか必ず終わる(永遠に続く手順はアルゴリズムではない)
- 入力と出力がある — 何を受け取って何を返すかがはっきりしている
「良い感じに並べる」は明確ではないので失格。「1から順に数を足し続ける」は終わらないので失格です。
手順は3つの型でできている
驚くことに、どんなに複雑なプログラムも、次の3つの組み合わせだけで書けます(構造化定理と呼ばれる有名な事実です)。
- 順次 — 上から順に実行する
- 分岐 — 条件によって進む道を分ける(もし〜ならば)
- 反復 — 条件が満たされる間、繰り返す
たった3つです。C言語の if も for も while も、この3つの型に名前を付けたものにすぎません。
日常にもこの3つしかない
朝の支度で確かめてみましょう。「顔を洗う→歯を磨く」は順次。「雨が降っていれば傘を持つ」は分岐。「かばんに必要なものが全部入るまで詰める」は反復です。私たちは無意識にこの3つを組み合わせて生活しています。プログラミングが特別な才能を必要としないと言われるのは、この意味においてです。
ちなみにアルゴリズムという言葉は、9世紀の数学者アル=フワーリズミーの名に由来します。1000年以上前から、人は「誰がやっても同じ答えにたどり着く手順」を大切にしてきたわけです。
例: 一番背の高い人を見つける
10人が並んでいます。一番背が高い人を見つける手順を組み立ててみましょう。人間なら一目で分かりますが、一度に1人しか見られないという制約でやってみます(これが機械の見え方です)。
- 最初の人を「暫定1位」として覚える
- 次の人を見る
- その人が暫定1位より高ければ、暫定1位を入れ替える
- 最後の人まで、2と3を繰り返す
- 最後に残った暫定1位が答え
順次(1)・反復(4)・分岐(3)が全部入っています。しかもこの手順は、10人でも1万人でもそのまま通用します。手順が人数に依存しない——これが良いアルゴリズムの手ざわりです。
覚えておきたい癖
手順を作ったら、必ず「例外」を確認してください。
- 人が0人だったら?(暫定1位を決められない)
- 同じ身長の人が2人いたら?(先に見つけたほうを残す、などの決めが要る)
この端っこの場合を考える癖が、のちにバグの数を大きく減らします。プロと初心者の差が最も出るのは、実はここです。手順を作ったら「0個のとき」「1個だけのとき」「全部同じとき」の3つを当ててみる。習慣にする価値のある確認です。