道具は4つ揃いました。分解・パターン・抽象化・アルゴリズムです。ここでは実際に、日常の問題を機械が実行できる手順に落としてみます。これができれば、あとは文法を覚えるだけという段階に入ります。
例題1: 自動販売機のおつり
1000円を入れて150円の飲み物を買ったとき、850円のおつりを枚数が最も少なくなるように返す手順を考えます。
- おつり ← 投入金額 − 商品の値段
- 大きい硬貨から順に(500円、100円、50円、10円)次を繰り返す
- その硬貨でおつりを割った商の枚数だけ、その硬貨を出す
- おつり ← おつりを、その硬貨で割った余り
- おつりが0になったら終了
850円なら、500円が1枚(残り350)、100円が3枚(残り50)、50円が1枚(残り0)。合計5枚です。大きいものから順に取れるだけ取るというこの考え方には、貪欲法という名前が付いています。
例題2: じゃんけんの勝敗
自分と相手の手を受け取り、勝敗を返します。素直に書くと、組み合わせを9通り全部書くことになります。でもパターンを探すと、こう縮みます。
- 2つの手が同じなら「あいこ」
- 自分がグーで相手がチョキ、自分がチョキで相手がパー、自分がパーで相手がグー、のいずれかなら「勝ち」
- それ以外は「負け」
9通りが3通りになりました。先に例外(あいこ)を片づけると、残りが単純になる——これは実務でもよく効く型です。
例題3: 朝の準備を最短にする
ここには新しい観点が入ります。同時にできるかです。
- お湯を沸かす(5分・待つだけ)
- 顔を洗う(3分・手が要る)
- パンを焼く(4分・待つだけ)
順にやれば12分ですが、「お湯を沸かす」と「パンを焼く」を先に始めて、待つ間に顔を洗えば5分で済みます。プログラムの世界でも、待ち時間の間に別の仕事をする考え方があります(並行処理)。今は「順番の付け方で、かかる時間が変わる」ことだけ知っておいてください。
書けたら、必ず変な入力で試す
手順ができたら、意地の悪い入力を自分で当ててみてください。おつりの例なら「ちょうどの金額を入れた(おつり0円)」「1円足りない」「両替できる硬貨が切れている」。じゃんけんなら「グーとしか書かれていない入力」。普通の入力で動くのは当たり前で、変な入力で壊れないかが品質です。この習慣は、のちのセキュリティの話にまっすぐつながります。
共通する進め方
どの例題でも、やったことは同じです。
- 入力と出力をはっきりさせる(何をもらって、何を返すか)
- 大きい流れを分解する
- 繰り返せる部分・共通部分を見つける
- 例外(0円のとき、あいこ、在庫切れ)を洗い出す
- 擬似コードに落とす
この順番は、これから何度も使います。困ったら1に戻ってください。