関数再考

初めのうちは再帰は理解するのが難しいと思う人が多い.難しいと思ってしまうのは,主に関数に対して誤ったメタファ(比喩)をあてはめていることによる.人々は関数をマシンの一種ととらえがちである.原料がパラメータで届き,ほかの関数に下請けに出して処理し,最後に完成品を組み立てて,返り値として出荷する.関数に対してこのメタファをもっていると,再帰は不可解ということになる.マシンがどうやって作業を自分自身に下請けに出すのか? 動作中のマシンにはそんな余裕などないじゃないかと思ってしまうことになる.
関数は進行しつつあるプロセスであると見る方が,メタファとしては適当であろう.再帰はプロセスの中では自然なものである.日常生活でも再帰的なプロセスをよく見る.たとえば,ヨーロッパ史における人口変化に関心をもっている歴史家を考えてみよう.資料を調べるプロセスは以下のようなものだろう.

  1. 1つの資料を手に入れる.
  2. 人口変化に関係する情報を探す.
  3. その資料がほかの役立ちそうな資料に言及していたら,ほかの資料を調べる.

このプロセスは理解しやすいものだが,第3ステップにより同じプロセスが何度か適用されることがあるので,再帰的なプロセスになっている.
こうしたわけであるから, our-memberについても,何かがリスト中のメンバになっているかを判定するマシンであるとは考えずに,判定するための一連のルールであると考えてほしい.このように関数を考えると,再帰が不可解であることはなくなる.
ANSI Common Lispポール・グレアム

再帰を考える場合,数列の関係式のようなものだろうか.単純なものをあげると, a_{n+1}=2a_{n}初期条件はa_0=1のようになっているものとか.あまり良い意味では使われないが,辞書である言葉を調べたときにその調べた中に更に分からない言葉があったらその言葉を辞書で調べるといった一連の作業.分からないものを常になくしていく作業.人にも必要なことなのかもしれない.難しいのは,人の場合どこまで分かっているのか自体が分からない事があるということだろうか.