こんなクイズがある。コンピュータネタ、目次へゾウを冷蔵庫に入れる3つの手順」は
1=冷蔵庫を開ける
2=ゾウを冷蔵庫に入れる
3=冷蔵庫を閉める
では、「キリンを冷蔵庫に入れる4つの手順」は?正解は
1=冷蔵庫を開ける
2=ゾウを冷蔵庫から出す
3=キリンを冷蔵庫に入れる
4=冷蔵庫を閉める
なのだそうだ。クイズとしては面白いが、これをアルゴリズムの例として出すと大問題になる。(最初に見たのはプログラム関連の本だった。)
ではプログラムのアルゴリズムとして見た場合、上の手順に何を付け加えればよいかと考えてみた。ひょっとしてこんなところにプログラマの個性と意地と経験の差が現れるのかもしれない。
- ゾウを出さないとキリンを入れられないというのは明記されていないが要件にあるのか。
- ゾウを入れたあとの冷蔵庫の空きスペースにキリンが入らないという前提はどこに述べられているのか。
だいたい、冷蔵庫のサイズにゾウが入るということも述べられていないではないか。- スペースが許すからといってキリンとゾウを一緒に入れても良いのだろうか。もしこれがウサギとライオンだったらまずいんじゃないか。それをチェックしないといけないというのであれば、冷蔵庫には一匹づつしか入らないという要件だと仮定した方がプログラミングは楽になる。いずれにせよもっと要件をはっきりさせてもらわないと。(カエルとヘビとナメクジを入れると、どうなるのだろう。)
- アルゴリズムの対称性からいうと、ゾウを入れる前にも「冷蔵庫を空にする」という手順が必要だろう。それともコンパイラが「変数:冷蔵庫」を初期化してくれていると仮定してもいいのか。
- 冷蔵庫を変数と考えて良いのなら、ゾウをいちいち出さずともキリンで上書きできるんじゃないか。
- ゾウが入ったからといってキリンが同じ変数域に入るとは考えにくい。首が長いから、整数演算のためには上位桁と下位桁に分離して納めなければならないんじゃないか。
- 初期処理ルーチンに冷蔵庫の大きさとゾウ、キリンの大きさを比較して、入りそうもなかったらメッセージ出してプログラムが停止するという仕様にすると、エラー時に単純再実行が可能になるからいいんじゃないだろうか。
- ゾウやキリンが入るだけのスペースがあるかどうかをチェックするのはいいとして、その部分には例外処理を使った方がいいんじゃないか。そのほうが後々の拡張時に手間がかからないだろう。
- 言語によっては例外処理をサポートしていなかったり、例外なく例外処理を強要したりする。従って、やはり初期処理ルーチンを入れた方が設計としては汎用性が高いと考えられないだろうか。
他にもいろいろ考えてみてください。
- ここではゾウとキリンだけど、あとから入れる動物もゾウだった場合、入れ替える必要があるのだろうか。入れ替えない方が当然処理は速くなる。
- 冷蔵庫のドアをいちいち閉めないといけないのだろうか。バッチ処理はともかくとしてオンラインなら閉めなくても動くんじゃないか?
- 冷蔵庫に入れるということは冷やすということだから、予め殺すなり、眠らせるなりしておいた方がいいんじゃないか?それは先行プログラムがやってくれるとしても、寝ているかどうか、死んでいるかどうかの入力チェックはやらなければならないんじゃないかなあ。
- でもペンギンやシロクマの場合はいいんじゃないの?動物によって冷蔵庫の温度を変えるというチェックを入れないと。(ニョーボの意見です。)