P35: 正の整数を素因数分解する

直接的に実装。
本当は、mは1+ではなく、次の素数を返す関数で増加させたいところ。

;; P35
(defun prime-factor (n)
  (labels ((iter (n m limit res)
	     (cond
	       ((> m limit) (reverse (cons n res)))
	       ((= (mod n m) 0) (iter (/ n m) m (sqrt (/ n m)) (cons m res)))
	       (t
		(iter n (1+ m) limit res)))))
    (cond
      ((or (< n 1) (not (integerp n)))
       (error "n=~a: 1以上の整数を指定してください。" n))
      ((= n 1) (list 1))
      ((iter n 2 (sqrt n) '())))))

(prime-factor 315)
;; => (3 3 5 7)