公開

アルゴリズムとは?料理で学ぶ順次・分岐・反復とフローチャート

文:野澤 嘉孝 (ソフトウェアエンジニア/プログラミングスクール Sandbox 代表)

アルゴリズムとは?料理で学ぶ順次・分岐・反復とフローチャート

この記事の概要

「野菜をふつうに切って、いい感じに煮て」。人には伝わるこの指示、コンピュータにも通じるのでしょうか? アルゴリズムとは、問題を解くための具体的な手順です。 文化祭のカレー作りを入口に、「相手が迷わず実行できる手順」の書き方を考えましょう。 先に結論:順番・条件・繰り返しを具体的にする

「野菜をふつうに切って、いい感じに煮て」。人には伝わるこの指示、コンピュータにも通じるのでしょうか?

アルゴリズムとは、問題を解くための具体的な手順です。

文化祭のカレー作りを入口に、「相手が迷わず実行できる手順」の書き方を考えましょう。

先に結論:順番・条件・繰り返しを具体的にする

  • アルゴリズム=解決の手順。 何をするか、何で判断するか、どう終わるかを明確にする。
  • フローチャート=手順を図にしたもの。 記号と矢印で、処理の流れを見えるようにする。
  • 基本の制御構造は3つ。 順次は「順に進む」、分岐は「条件で選ぶ」、反復は「繰り返す」。
  • 反復は、条件と値の変化を追う。 終了条件があっても、そこへ近づく処理がなければ止まらない。

後半では、具体的な手順が役立つ例として「ハッシュ関数」を紹介します。データの照合や、探す場所を決めるための仕組みです。

「ふつう」が分からない先輩と、カレーを作る

文化祭の打ち上げで、カレーを作ることになったユウキ。テッパン先輩が、機械の役を引き受けます。

テッパン先輩「僕は、言われたとおりにしか動かないから」

ユウキ「じゃあ、野菜を切ります」

テッパン先輩「何を、どのくらい?」

ユウキ「……ふつうに」

テッパン先輩「ふつう、が無い」

Sandy「そこで止まるんかい! ……せやけど、手順を考える練習にはちょうどええねん」

人間どうしなら、経験や文脈から大きさや順番を補えます。しかし、プログラムに処理を書きたいときは、使える操作と、判定できる条件を具体的にする必要があります。

野菜をふつうに切るという曖昧な指示を、分量・大きさ・時間のある指示へ具体化する例

実行者ができる操作と、判定できる条件に合わせて指示を具体化する。

「にんじん200gを2cm角に切る」「中火で3分炒める」と書けば、人に渡す指示としては具体的になります。ただし、料理はあくまで比喩です。機械に実行させるなら、切る機能や時間を測る機能なども必要。「竹串が通る?」も、人なら判断できても、機械には測定方法や判定基準を用意しなければなりません。

どこまで細かく書くかは、実行者がすでにできる操作によって変わります。

アルゴリズムで確かめたいこと

初めて学ぶときは、次の観点で手順を確認しましょう。

観点

確かめること

明確さ

各操作と条件が具体的で、実行できるか

結果の一貫性

同じ入力を、同じ決まりで処理できるか

終了

答えを求める処理が、有限回の操作で終わるか

正しさ

想定した入力に対して、目的の答えになるか

この記事では、同じ入力なら同じ結果になる決定的な手順を扱います。アルゴリズム全般には乱数を使うものもあるため、「結果が毎回同じでなければアルゴリズムではない」と一律には言えません。

また、終了条件を書くだけでは、止まる保証にはなりません。 たとえば0以上の整数から始めて「0になるまで1ずつ減らす」なら、有限回で0になります。でも、値を減らし忘れると、正の数のまま条件を満たせず、繰り返し続けます。

アルゴリズムとプログラムも区別しましょう。アルゴリズムは解決の手順そのもの、プログラムはその手順をコンピュータが実行できる言語などで表したものです。

フローチャートは、手順を見える形にした図

フローチャート(流れ図)は、処理や判断を記号で表し、矢印で実行の順番をつないだ図です。

開始終了の端子、処理、判断、入出力を表す4つのフローチャート記号

記号の形と矢印で、処理の役割と進む順番を表す。

記号

形

主な役割

端子

角の丸い長方形など

開始・終了

処理

長方形

計算や変数への代入

判断

ひし形

条件に応じた進路の選択

データ

平行四辺形

入力・出力

たとえば「数を入力する→2倍する→結果を表示する」なら、入出力の記号と処理の記号を順につなぎます。判断の出口には「はい/いいえ」などを書き、条件が成り立つときにどちらへ進むかを明確にします。

図にすると、「いいえのときの行き先がない」「更新する処理が抜けている」といった問題を見つけやすくなります。ただし、形が整っているだけで、正しい手順になるわけではありません。中の条件や処理も読みましょう。

制御構造は、順次・分岐・反復で考える

制御構造とは、処理をどの順番で実行するかを決める仕組みです。基本となるのが、順次・分岐・反復の3つです。

順番に進む順次、条件で選んで合流する分岐、判定へ戻る反復の流れ図の比較

分岐と反復はどちらも条件を調べるが、反復には戻る流れがある。

順次:書いた順に進む

順次構造は、処理を順番に実行する形です。カレーなら「野菜を切る→炒める→水を入れる」が例になります。

ただし、「書いた順なら何でもよい」わけではありません。水を入れる前に炒めるなど、目的に合う順番を設計する必要があります。

分岐:条件で道を選ぶ

分岐は、選択構造とも呼ばれます。「辛口が好きなら辛口のルー、そうでなければ甘口のルー」のように、条件によって行う処理を変えます。

選んだ処理の後は合流し、次へ進むのが基本形です。条件を見ること自体は、後で紹介する反復にも登場します。

反復:条件や回数に従って繰り返す

反復は、繰り返し構造とも呼ばれます。「まだ竹串が通らなければ、もう5分煮て確かめる」のように、処理をした後で同じ判定へ戻ります。

ユウキ「条件を見るのが分岐、じゃないんですね」

Sandy「反復も条件を見るで。繰り返す流れに戻るんか、そこを見とくんや」

反復には、条件が成り立つ間だけ続ける形や、決まった回数だけ続ける形があります。続ける条件と、終了する条件を取り違えないことが大切です。

料理で「できるまで煮る」と書いても、実際にその状態へ到達する保証まで自動で生まれるわけではありません。終了を厳密に考える練習は、回数を追える数値の例で確かめましょう。

順次・選択・反復を組み合わせて、処理を見通しよく書く考え方が構造化プログラミングの基礎です。分岐の中に反復を入れるなど、3つは組み合わせて使えます。

オリジナル学習例:1+2+3を、反復で計算する

この記事用のオリジナル学習例です。実際の共通テスト問題ではありません。

次の手順を考えます。

  1. 合計を0、変数iを1にする。
  2. iは3以下か? はいなら手順3へ、いいえなら手順5へ進む。
  3. 合計にiを足す。
  4. iを1増やし、手順2へ戻る。
  5. 合計を表示して終了する。
合計0とi1から始め、iが3以下の間は加算と更新を繰り返し、6を表示する流れ図

iを更新し、最後にi=4で条件が成り立たなくなると終了する。

実際に値を追ってみましょう。

判定時のi

i≦3?

加算後の合計

更新後のi

1

はい

1

2

2

はい

3

3

3

はい

6

4

4

いいえ

加算しない

終了

答えは6です。加算は3回ですが、条件の判定は、最後の「いいえ」まで含めて4回あります。

もし「iを1増やす」を書き忘れると、iはずっと1のままです。条件が成り立ち続け、終了へ進めません。戻り線だけでなく、繰り返すたびに何が変わるかも確認しましょう。

同じ答えでも、手順の良さは違う

正しい答えが出ることは大前提です。そのうえで、処理の回数や使うメモリ、読みやすさなども比べます。「手数が少なければ、どんな場合も最良」とは限りません。

たとえば、たくさんのロッカーから1人分の荷物を探すとします。端から順に調べる方法と、名前から調べる場所を絞る方法では、必要な確認回数が変わります。

Sandy「同じ答えでも、たどり着く道は1本やないねん。どんな入力で、どれだけ手間がかかるかも見てみよか」

ここからは、目的に合わせて手順を工夫する具体例を見てみましょう。データから値を計算する「ハッシュ関数」です。その値は、探す場所を決めたり、ファイルの変化を確かめたりするために使えます。

ハッシュ関数とは、データから値を求める仕組み

ハッシュ関数は、データを受け取り、それに対応するハッシュ値を求める関数です。 ここでは、SHA-256のように出力の長さが決まった形式を例にします。

同じ関数へ同じデータを渡せば、同じ値が返ります。SHA-256の出力は256ビットで、16進数なら64桁です。

curryを2回計算した同じSHA-256値と、Curryの異なる値を先頭12桁で比較する図

同じ方式・同じデータなら同じ値。図はSHA-256の先頭12桁だけを表示。

図ではUTF-8で表した「curry」と「Curry」の値を計算しました。表示は先頭12桁の抜粋です。大文字・小文字の違いも入力の違いなので、この例では違う値になります。

暗号学的ハッシュ関数は、入力のわずかな違いで出力が大きく変わるように設計されます。ただし、「違う入力なら必ず違う値」「全桁が必ず変わる」という保証ではありません。

衝突:違うデータが同じ値になることがある

異なる入力から同じハッシュ値が出ることを、衝突と呼びます。出力の種類より入力の種類が多ければ、すべてを別々の値へ割り当てることはできません。

3で割った余りを返す単純な関数で、異なる入力12と15が同じ0になる衝突の例

違う入力でも同じ値になり得る。図の単純な関数は暗号学的ハッシュではない。

図の「3で割った余り」は、衝突を説明するための単純な例です。12も15も余りは0になります。これは安全性を備えた暗号学的ハッシュ関数ではありません。

暗号学的ハッシュ関数では、衝突する入力の組を実用的な計算量で見つけにくいことが重要です。「衝突が存在しない」とは違います。

用途①:ファイルの変化を確かめる

受け取ったファイルのハッシュ値を、信頼できる場所から得た期待値と比べると、破損や変更の検出に使えます。値が違えば、同じデータではありません。

値が違えば、データも違う。一致していても、衝突の可能性があるため、同一だと数学的に断定はできない。 この違いを押さえましょう。

また、比較元の値まで書き換えられると照合の意味が失われます。だから、期待するハッシュ値は信頼できる場所から得る必要があります。

用途②:データを探す場所を決める

ハッシュ表では、キーから値を計算して、格納場所や調べる場所を決めます。ロッカーの番号を計算するイメージです。

ただし、同じ場所に割り当てられることがあるため、衝突した場合の保存・探索方法も必要です。適切な条件では効率よく探せますが、必ず1回の確認で見つかるわけではありません。 この用途のハッシュ関数すべてに、暗号学的な一方向性が求められるわけでもありません。

ハッシュと暗号化、パスワード保存の違い

比較

主な目的・性質

暗号化

鍵を使ってデータを保護し、対応する鍵で復号して元のデータを得る

暗号学的ハッシュ

値から入力を求めにくくする。復号して元へ戻す仕組みではない

ただし、ハッシュにしても、候補を次々に計算して一致するものを探される可能性はあります。「戻せないから、短いパスワードでも安全」とは言えません。

パスワード保存には、Argon2idなどの専用方式、保存ごとに異なるランダムな値「ソルト」、適切な計算コストを使います。

ソルトは、同じパスワードでも保存値が同じにならないようにするための値です。さらに、候補を1回試す計算にも手間がかかるようにして、大量の推測をしにくくします。

SHA-256を1回計算して保存するだけでは、候補を高速に試されやすく、適切なパスワード保存にはなりません。図のSHA-256計算は、ハッシュの性質を学ぶ例として分けて考えましょう。

まとめ:形だけでなく、中の処理も具体的に

  • アルゴリズムは問題を解く手順。実行できる明確さ、結果の正しさ、終了の仕方を確かめる。
  • フローチャートでは、記号・条件・矢印を組み合わせて流れを表す。
  • 基本の制御構造は順次・分岐・反復。反復では条件と値の変化を追う。
  • ハッシュは照合や探索に役立つが、衝突や用途ごとの性質を区別する。

ユウキはレシピを書き直しました。「ふつうに」を具体的な大きさや時間へ変え、条件によって選ぶ処理と、繰り返す処理を整理します。

テッパン先輩「今度は、何をするか分かる」

Sandy「図の形にしただけやなくて、中の言葉まで具体的になったんやな」

ほかのテーマは情報Ⅰサバイバルの記事一覧から読めます。手順を実際のプログラムや作品にしてみたい方は、プログラミングスクールSandboxもご覧ください。

参考資料

あわせて読みたい記事

Sandboxのサポート内容 Sandboxの情報Ⅰ学習サポートを見る →
共通テスト情報Ⅰのまとめ 共通テスト「情報Ⅰ」対策シリーズの一覧を見る →
野澤 嘉孝

この記事を書いた人

野澤 嘉孝

ソフトウェアエンジニア/プログラミングスクール Sandbox 代表

ソフトウェアエンジニア。同志社大学理工学部を経て、京都大学大学院で核融合発電の基礎研究(プラズマ物理)に従事。高校生向け数学塾の講師、大学での物理実験の授業を通じて延べ500名以上の学生をサポート。現在は業界特化型SaaSの開発に携わりながら、小中高生向けプログラミングスクール Sandbox を運営。

プロフィールと執筆記事の一覧 →

「情報Ⅰ、うちの子はどう対策すればいい?」

情報Ⅰ対策について無料で相談する

志望校の配点を一緒に確認したい方は → 無料の学習相談へ

入会金無料・いつでも退会OK・退会後もいつでも再入会できます