Shammer's Philosophy

My private adversaria

ashでバイナリサーチをする?

Land of Lisp を ClozureCL で - Shammerismで言及したLand of Lispだが、最初のプログラムは数当てゲームだった。1から100の中の任意の数をユーザーが決定し、コンピュータの示した数の方が大きい場合は「より小さく」という主旨のコマンドを、コンピュータの示した数の方が小さい場合は「より大きく」という主旨のコマンドを入力すると、コンピュータがより大きい、あるいは小さい値を表示する。コンピュータが正解を知っているわけではなく、表示された数が正解はユーザーのみぞ知る、というタイプのプログラムだが、この中でLispでシフト演算をする - Shammerismでやったashを使用していた。ashを使用したことについての説明は以下のようにある。

guess-my-numberでash関数を使うことで、可能な解を含む探索空間は1回毎に半分になり、最終的な回答を急速に絞り込むことができる。先に述べたように、この半分半分にしてゆくプロセスはバイナリサーチと呼ばれ、コンピュータプログラミングで有用なテクニックだ。ash関数はLispでバイナリサーチを書くのによく使われる。

ashについて書いたときには、こんな視点は持っていなかった。何か該当しているものを探す、という処理を書くときには、ほとんど何も考えずに比較しているが、この方法は甚だ非効率なのかもしれない。ashはそのままでは文字の比較というか照合には使うことはできないので、使えるとしても工夫が必要だが、こうした視点を持っているかどうかでいろいろな処理の書き方が変わってくるだろう。まだまだ自分は未熟もいいところだ。