かなり前にメモした web site だけど、けっきょく読んでない。 そんなわけで、実際に elisp で書きながら少しずつ読み進めていくことにした。 …暇人とか言わんといて下さい。 ;(
とりあえず階乗の再帰関数版。
(defun ys:factorial1 (first number) (if (> number 0) (* (ys:factorial1 first (1- number)) number) first))
通常のループ版。 説明用でなければ普通こちらを書くだろうな。
(defun ys:factorial2 (first number) (let ((value first) (num 1)) (while (<= num number) (setq value (* value num)) (setq num (1+ num))) value))
次は組み合わせの再帰関数版。 web page に書かれている 20, 8 を代入すると、一瞬、Meadow が止まります。
(defun ys:combination1 (m n) (if (and (> m n) (> n 0)) (+ (ys:combination1 (1- m) (1- n)) (ys:combination1 (1- m) n)) 1))
通常のループ版。
素直に書くとこうなる?
分子と分母が大きくなりすぎて、すぐに使えなくなってしまう。
それとミスがあるので後で修正しなくっちゃ。←済み。
(defun ys:combination2 (m n) (if (and (> m n) (> n 0)) (let ((denominator 1) (numerator 1) (num 1)) (setq m (1+ m)) (while (<= num n) (setq denominator (* denominator (- m num)) numerator (* numerator num)) (setq num (1+ num))) (/ denominator numerator)) 1))
もう一つ、通常のループ版。 この中ではこれが一番まとも。
(defun ys:combination3 (m n) (let ((value 1) (num 1)) (when (and (> m n) (> n 0)) (setq m (1+ m)) (while (<= num n) (setq value (/ (* value (- m num)) num)) (setq num (1+ num)))) value))
とりあえず今日はここまで。
四則演算は elisp のテキスト処理関数を使って書くことにしよう。
elisp じゃなくて Ruby で書いた方が良かったかも。 最近は全く使ってないので、こういった機会に触れないと忘れちゃう。
なんて思ったけど、elisp も似た様なものなので、とりあえずこのまま進めよう。
後で気付いたんだけど、interactive
なんて使う必要ないですね。
というわけで修正。 ;(
翌日の 5/28, gony さんや bg66 さんとお会いできる? 楽しみですよ。 :D