2017/08/05 00:09

普通のバブルソートと普通ではないバブルソート」で使った、 “[5, 9, 2, 1, 3, 7, 6, 4, 8]” という配列でちょっと話をしてみます。

ソートのアルゴリズムはいくつもあるのですが、講習をやった際におそらく出てくるだろうアルゴリズムの一つにバブルソートがあるかと思います。もう一つおそらく出てくるだろうアルゴリズムとして、選択ソートがあると思います。選択ソートはwikipediaで読んでもらうとします。

ここでは、すこし変形した選択ソートを考えてみます。どう変形するかというと:
1. 配列1に元データが入っている
2. 空、あるいは特定の値で埋められた配列2を用意する
3. 配列1の中から一番小さい値を、配列2の1番目 or i番目の要素として入れる
4. 配列1のその要素を、無効ないし選択済みをしめす値に書き換える
5. 3. と4. を適当に繰り返す

こうすると、“[5, 9, 2, 1, 3, 7, 6, 4, 8]” はこのようになります (面倒なので “,” は書かないことにします):
配列1       配列2 
[5 9 2 1 3 7 6 4 8] → []
[5 9 2 X 3 7 6 4 8] → [1]
[5 9 X X 3 7 6 4 8] → [1 2]
[5 9 X X X 7 6 4 8] → [1 2 3]
[5 9 X X X 7 6 X 8] → [1 2 3 4]
[X 9 X X X 7 6 X 8] → [1 2 3 4 5]
[X 9 X X X 7 X X 8] → [1 2 3 4 5 6]
[X 9 X X X X X X 8] → [1 2 3 4 5 6 7]
[X 9 X X X X X X X] → [1 2 3 4 5 6 7 8]
[X X X X X X X X X] → [1 2 3 4 5 6 7 8 9]

このように、配列2にはソートされた結果が入ります。

さて、ではソートを課題とした場合、講習に参加した児童・生徒が、たとえばバブルソートを使った場合のみ正解とするべきでしょうか。あるいは逆の場合もあるでしょう。あるいは、もしかしたらマージソートを思いつく/知っている児童・生徒もいるかもしれません。そのような場合も誤りとするべきでしょうか。

このような場合、どれか一つのアルゴリズムのみを正解とするのはナンセンスでしょう。ですから、要求した結果が得られるなら、どのアルゴリズムを使ってもかまわないとします。同時に、どのようなデータ構造を使ってもかまわないとします。

結果がちゃんと得られればいい」という態度とも言えるかと思います。この態度はあまりに適当と思われるかもしれません。

ですが、講習に参加した他の児童・生徒のやりかたと比べるという過程も講習に入れたなら−−もちろん入れますが−−、他のデータ構造とアルゴリズムが存在するのだということを確認できるということにも繋がるでしょう。ですので、むしろ積極的に、この適当な方法を選択したいと考えています。

むろん、ソートならソートとして、きちんと動くことを児童・生徒自身が理解することも必要ですし、他の児童・生徒に説明できることも必要です。この部分については「なんとなく」は認めません。「なんとなくを認めない」ためには、特定の具体的なプログラミング言語を用い、書いたプログラムをPCやタブレットで実行し、確認するという方法もあるかと思います。ですが、経験がある人にはわかると思いますが、「動いたことで確認とする」というのは、実は極めて甘い基準です。また、本企画の場合、「今回はこの言語かこの言語でやってみよう」などと、私が言い出しかねません(笑。

問題は、「なぜきちんと動くと言えるのか」を説明できること、あるいは強く言うなら証明できることです。その際、データ構造の図示は必須でしょう。また、同時に自然言語を使ってこの部分を行なうことも可能です。より形式的にするために、複数のパラダイムに対応した、処理系が存在する言語の使用や擬似言語を用意する方向も検討する必要があるかとも思います。もっとも、本企画の場合、いろいろな言語の型の要素を含んでいなければならないので−−ここで特定のパラダイムを採用すると、本企画の主張と矛盾しますから−−、擬似言語の設計も難しいのですが。それは置いておくとして、実行する環境が存在しないという点をむしろ利点として活用するという方向もあるのではないかと思います。もっとも、まったく動かないというのもつまらないので、擬似言語を用意するとしても、いずれなんらかの形で実装するかもしれないという可能性は残しておきたいと思います。