[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bep] learning lisp: recursive
- To: bep@argv.org
- Subject: Re: [bep] learning lisp: recursive
- From: Reiko TAKAHASHI <HFC03614@nifty.ne.jp> (高橋玲子)
- Date: Sun, 10 Jun 2001 07:15:38 +0900
- Delivered-To: mailing list bep@argv.org
- Mailing-List: contact bep-help@argv.org; run by ezmlm
r高橋です。
Reply TAKAHASHI Naoto <ntakahas@...>'s message:
} > nと2をかけたものだと(2* n)って書いたりもできるんですか?
}
} 普通は (* 2 n) と正直に書きますが、自分で関数を定義すればそういう書き
} 方もできます。
}
} (defun 2* (n) (* 2 n))
}
} アルファベットが入っていませんが、2* というシンボルが関数名です。
数字以外のなにかが一つでも入っていれば、その記号(というか記号列という
か……)はシンボルになれるんですね?
} プログラムを書いていると 1+ と 1- は非常によく使うので、この二つは
} Emacs Lisp が最初から用意してくれています。
(1- n)と書いた場合、最初の 1- は関数で、つぎの n が引数だったんですね。
たしか、そういう話から始まった話題だったはずなのに、1- が関数だったとは考
えつきませんでした。
} 書き方の問題ですが、fact(1) ではなくて (fact 1) ですね。
うっ、そうでした! 関数なんだから!と自分に言い聞かせていたら、うっか
り、こんな書き方に……。
} 種あかしをすると、fact は factorial の略です。日本語だと階乗です。聞い
} たことがあると思います。数学だとnの階乗は n! と書き、
}
} n! = n * (n-1) * (n-2) * ... 2 * 1
}
} です。これを書き直すと
}
} nが1なら n! = 1
} そうでなければ n! = n * (n-1)!
}
} となります。上の (defun fact ... はこれをそのまま Lisp に翻訳したものです。
……factorial、たしかに聞いたことはあるのですが、意味とか使い道とかは見
事に忘れています。!を使うことも忘れていた……(というか、教わったかどうか
を覚えていません(^^;;;))。
「再帰的呼び出し」が解ったかどうか、確認のために、もう一度だけ……、
(defun fact (n)
(if (= n 1)
1
(* n (fact (- n 1)))))
nが4、(fact 4) の場合、
(* 4 (fact (- 4 1)))
↓
(* 4 (* 3 (fact (- 3 1))))
↓
(* 4 (* 3 (* 2 (fact (- 2 1)))))
↓
(* 4 (* 3 (* 2 1))) => 24
ですね。
すごいとんちんかんかもしれませんが、Lispには、-の付く数(負の数)はあり
ますか? たとえば、
(fact -4)
とかの場合(があったとしたら)、
(* -4 (fact (- -4 1)))
↓
(* -4 (* -5 (fact (- -5 1))))
↓
(* -4 (* -5 (* -6 (fact (- -6 1)))))
とかになって、永久に終わらない気がするのですが……。
それと、(if ...) というのもLispでは「関数」と考えられますか?
(= ...) と、(equal ...) は同じ意味で、評価した結果は数字ではなく、 t か
nil になる、と考えていいですか?
# 「頭山」のあらすじ(?)が、
http://member.nifty.ne.jp/~tomikura/j/rakugo/a/atamayama.html
にありました。しかし……、なんて体の柔らかい人なんだ……!!
**-***-***-***-***-***-***-***-***-***-***-***-**
Reiko TAKAHASHI (高橋玲子)
E-mail: HFC03614@...
ICQ UIN: 85924121 (Twinkle)
**-***-***-***-***-***-***-***-***-***-***-***-**