HarmonyFidelisHarmonyFidelis
ログイン
ニュース主要プロジェクト人物・組織アカデミー

アルゴリズム:最大値探索の仕様を定め、実行し、理由を説明する

契約から証明へ:最大値探索を追い、その限界をテストし、方法、プログラム、正しさ、終了を区別します。

アルゴリズム:最大値探索の仕様を定め、実行し、理由を説明する

1. 目標、レベル、前提知識

  • アルゴリズムの許可される入力と要求される出力を定義する。
  • 変数、条件、ループを用いて最大値探索の実行を記録する。
  • 正しさと終了を説明し、証明とテストを区別する。

アルゴリズムは、入力データを結果へ変換するための明確な方法を記述します。ここでは、許可されたすべての入力に対して終了しなければならない決定的アルゴリズムを扱います。プログラムは、そのような方法を機械が実行できる言語で表現したものです。同じ方法を複数のプログラムで表現できます。

この入門を終えると、入力と期待される出力を明確にし、変数の値を追跡し、最大値を探索する手順が終了して正しい結果を返す理由を説明できるようになります。この技能は、もっともらしい出力を信じるのではなく、手順を検証するために役立ちます。

レベル:初級。整数を比較し、ここでリストと呼ぶ、順序のある値の列を読めれば十分です。負の数も許可されます。プログラミング言語の知識は必要ありません。まず紙の上で取り組んでください。コードへの移行は応用であり、隠れた前提条件ではありません。

2. 方法を考える前に問題を定義する

整数からなる、有限で空ではないリストの最大値を求めます。入力には同じ値が繰り返し現れてもよく、あらかじめ並べ替えておく必要はありません。出力は値であり、その位置でも出現回数でもありません。[3, 7, 7, 2] に対する期待される結果は 7 です。

「空ではない」という条件は事前条件であり、許可される入力を明確にします。事後条件は、要求される結果を表します。出力がリストに含まれ、かつリストのどの値以上でもあることです。空のリストには、返せる最大値が存在しません。この場合も受け付ける手順を設計するなら、エラーや別の結果を明示的に定義する必要があります。ゼロを勝手に作り出すべきではありません。

3. 曖昧さのない手順を作る

best という名前の候補を保持します。最初の値で初期化し、その後、残りの値を順番に調べます。調べている値が best より厳密に大きければ、best をその値に置き換えます。そうでなければ、そのまま保持します。最後の値を調べた後に best を返します。

代入は、記憶されている値を変更します。best ← x は「x の現在の値を best に記憶する」という意味です。永久に成り立つ等式ではありません。条件は行う処理を選び、ループは残りの値について手順を繰り返します。順序、初期化、条件も、最終結果と同じように方法の一部です。

best ← リストの最初の値
最初の値より後の各値 x について:
    もし x > best なら:
        best ← x
best を返す

これは疑似コードです。特定の言語の構文を指定せずに方法を記述しています。そのまま Python インタープリターに貼り付けてはいけません。

4つの値のリストと、記憶に保持する値を表した概念図。

人工知能の支援で生成したイラストです。記憶の役割を示唆するもので、正確な数値の追跡とその根拠は本文と表で説明しています。

4. 解答済みの例を追う

[3, 7, 7, 2] では、初期化によって best = 3 となります。比較する値はあと三つです。

調べる値更新前の bestx > best?更新後の best
73はい7
77いいえ7
27いいえ7

二度目に現れる 7 は、最大値を変えません。ちょうど三回の比較の後、結果は 7 となります。値が一つだけの場合、ループは実行されず、その値が返されます。比較回数を数えることは、実際の実行時間を測定することではありません。実行時間はプログラムや機械にも依存します。

5. 正しさと終了を説明する

各段階の後、best は、すでに調べた部分の最大値です。このように保たれる性質を不変条件と呼びます。最初は、調べた部分に最初の値しか含まれないので、この性質は成り立っています。次の値のほうが大きければ、その値に置き換えても性質は保たれます。そうでなければ、候補を保持しても性質は保たれます。最後には、調べた部分がリスト全体となるため、事後条件が満たされます。

n 個の値を持つ有限のリストでは、最初の値より後に n − 1 個の値が残ります。各段階で一つを処理し、前に戻らないため、残りの個数はゼロになるまで減っていきます。これによって、すべての値が等しい場合でも、終了することと比較回数が n − 1 回であることを説明できます。例を用いたテストは誤りを見つけることができますが、許可されたすべての入力についてのこの説明に代わるものではありません。

6. Python のプログラムに翻訳する

以下は、空ではない整数のリストに対する翻訳です。values[0] は最初の値を表し、range(1, len(values)) はそれより後のインデックスを順にたどります。字下げによって、ループと条件の範囲が決まります。

PYTHON
def maximum(values):
    best = values[0]
    for i in range(1, len(values)):
        x = values[i]
        if x > best:
            best = x
    return best

この関数は、事前条件が満たされていることを前提としています。入力を検証する完全なインターフェースではありません。空のリストでは、values[0] にアクセスするときにエラーが発生します。欠損値、異なる型の混在、無限のリストは、定義した問題の範囲外です。再利用する前に、契約と、受け付けない入力の扱いを明確にしてください。このコードの目的は方法の理解です。実務では、組み込みの最大値関数を使うほうが適切な場合があります。

7. ガイド付き演習

最大値探索の実行を記録する

[5, 1, 9, 3] に対して、手作業で手順を実行してください。調べる値、更新前の best、更新後の best を示す表を作り、出力と比較回数を記してください。

達成基準 : 実行記録で best を最初の値で初期化し、残りの各値を一回ずつ調べ、各比較での判断を説明していること。

自分で試した後に読むガイド付き解答:候補は 5 から始まり、1、9、3 を調べた後の値は順に 5、9、9 となります。三回の比較によって出力 9 に到達します。各行には、調べた値、更新前の候補、更新後の候補を示してください。正しい出力だけでは、推論を説明するのに十分ではありません。

8. 規模に見合ったプロジェクト

手順の仕様を定め、テストする

[12, 8, 15, 15, 4] に対して、事前条件と事後条件を書き、最大値探索の実行を記録し、終了する理由を説明してください。[-4, -2, -9]、[6]、[3, 3] のテストを追加してください。空のリストをどう扱う予定か、ゼロでの初期化がなぜ危険なのかを説明してください。

達成基準 : 成果物に、明示的な契約、四つの実行記録、不変条件の説明、終了の理由が含まれていること。許可された入力と、受け付けない空のリストを区別していること。

まず紙の上で取り組んでください。その後プログラムを使う場合は、その出力を自分の実行記録と比較してください。この少数の例で一致することは、限定的な検証です。不変条件の説明と終了の理由も残してください。成果物は、実行記録とテストを添えた小さな仕様書です。個人データは収集しません。

9. 転移の評価

方法を最小値に転用する

整数からなる、有限で空ではないリストの最小値を探索するよう、手順を変更してください。疑似コードを示し、[6, -1, 4, -1] の実行を記録し、保たれる性質と終了を説明してください。ゼロでの初期化に対する反例を見つけ、空のリストが引き続き契約の範囲外となる理由を明確にしてください。

達成基準 : 方法が指定された範囲全体で機能し、繰り返しと要素一つの場合を扱い、テストと証明を分けていること。また、覚えた規則を説明なく繰り返すのではなく、初期化、比較、終了の理由を説明していること。

ノートを見ずに、それぞれの選択の理由を説明して書いてください。その後、自分の方法を最大値探索と比較してください。どの手順がそのまま保たれ、どの判断が変わりますか?

10. 限界とよくある誤り

best をゼロで初期化すると、一部の正の値のリストでは動くように見えますが、[-4, -2, -9] では失敗します。この場合、プログラムは入力にすら含まれていない 0 を返します。最初の値で初期化すれば、この隠れた仮定を避けられます。要素が一つだけのリストや値の繰り返しは、許可された場合であり、異常ではありません。

リストの最大値は、その合計でも、リストに必ず一度だけ現れる値でもありません。アルゴリズムは、唯一の方法でなくても正しくあり得ます。別の方法として、先に並べ替えてから最後の要素を選ぶこともできますが、この問いだけのためには不要な作業が増えます。この単元は、任意の手順が終了することも、任意のプログラムがその方法に従うことも証明しません。この二つの性質には、それぞれ固有の説明が必要です。

11. まとめ、能動的な想起、次のステップ

進め方は、契約を定義し、方法を選び、一つの例の実行を記録し、保たれる性質と終了を説明したうえで、翻訳を検証することです。もっともらしい出力は一般的な証明ではありません。明日、読み直さずに、次の四つの質問に取り組んでください。

  1. アルゴリズムとプログラムをどのように区別しますか?
  2. [2, 5, 4] では、候補はどの値を取り、比較は何回行われますか?
  3. なぜゼロでの初期化は、一部の入力で失敗するのですか?
  4. この手順が、有限で空ではないすべてのリストで終了する理由を、初学者に説明してください。

短い参照回答:方法とその翻訳は別のものです。実行記録では 2 から始まり、5 になり、その後も 5 のままで、比較は二回です。ゼロでの初期化は、値に誤った下限を課します。まだ処理していない要素の個数は、一つずつ減ってゼロになります。

次のステップの提案:リスト内の値の探索と、その最大値の探索を比較することです。次の授業はまだ指定されていません。この根となる単元は、グラフの適格性を確認した後、カリキュラムを拡張できる状態を保ちます。

12. 出典と編集方法

この独自の単元は、二つの独立した教育機関の教育課程を関連づけています。一つは、フランスの「Numérique et sciences informatiques」Première の教育課程、2019 年 1 月 22 日の BOの付属文書 8 ページ「Langages et programmation」と 9 ページ「Algorithmique」です。もう一つは、イングランドの 2013 年 computing 教育課程の「Key stage 2」と「Key stage 3」です。出典は 2026 年 10 月 12 日に再読しました。対応づけの対象は、仕様、順次処理、選択、繰り返し、テスト、理由の説明です。これらの教育課程を全体として網羅していることを認証するものではありません。

本文、例、活動は、人工知能の支援を受けて準備されました。公開する前に、実行記録と計算例、および八つの言語版を検証する必要があります。学習効果や人間による確認を主張していません。