ichirin2501's diary

いっちりーん。

LispでPE

Lispを勉強し始めたので、Project Eulerの問題1、2、3を解いてみた。
書き方に慣れてないので手続き型の名残が垣間見える…ってレベルじゃねえからw


括弧が気持ち悪い? いいえ、括弧萌えです。

(defun PE1 (n)
 (do ((i 1 (1+ i)) (ans 0))
     ((>= i n) (return ans))
     (if (or (zerop (mod i 3)) (zerop (mod i 5)))
         (setq ans (+ ans i)))))

(defun PE2 (n)
   (do ((a1 1) (a2 2) (ret 0) (i 2 (1+ i)))
       ((< n a2) ret)
       (if (zerop (mod a2 2)) (setq ret (+ ret a2)))
       (setq a2 (+ a1 a2))
       (setq a1 (- a2 a1))))

(defun PE3 (n)
   (do ((i 2 (1+ i)) (ans 0))
       ((> (* i i) n) n)
       (if (zerop (mod n i))
               (progn (setq n (/ n i))
                      (print i)
                      (setq i (1- i))))))

Cのfor文に近い do を好んで使ってしまう、よくない。
代入処理を平気で使ってる時点で関数型のような書き方は出来てないなー。
たしか、純粋な関数型言語は代入〜的なものがなかったはず。