[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bep] learning lisp: recursive



 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)
**-***-***-***-***-***-***-***-***-***-***-***-**