letとlet

OCamlのletとLISPのletを混同してしまってこんがらがってしまいました。OCamlのletは変数や関数の定義。LISPの場合は局所変数の定義。

ついでに見つけた最大公約数を見つけるプログラム。個人的にはLISPのほうが好み。OCamlのほうがCに馴染んだ人にはわかりやすいかも。

(* OCaml *)

let rec gcd m n =

if m = 0 then n else

if m > n then gcd (m mod n) n else

gcd (n mod m) m

/* Common Lisp */

(defun gcd (a b)

(cond

((= b 0) a)

(t (gcd b (mod a b)))))

ついでのついでに見つけた日本認知学会の論文、林創「再帰呼び出しを含む手続きの処理の難しさ」。序文の最初の一文「本研究は, 再帰がなぜ人間の直観的な理解に合わず困難な課題であるのかについて, その原因を検討するものである.」が研究内容をずばり表しています。僕は子供の頃から、合わせ鏡、テレビカメラでテレビを映してテレビの中にテレビが出てくる現象、マイクのハウリングなんかに興味があったので、再帰は好きです。数学的帰納法や数列や微分方程式再帰っぽくて好きです。