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)