오늘은 간단하게 한 문제. 늘 빠지지 않는 Prime Number 관련 문제다.
문제 67, Prime Numbers
(= (__ 2) [2 3])
(= (last (__ 100)) 541)
n개의 Prime number를 반환하는 함수를 작성하는 것.
함수형 프로그래밍에서는 에라토스테네스의 체 방법이 자주 등장한다. (Haskell 홈페이지에 나와 있기도 하다.)
문제 67, Prime Numbers
(= (__ 2) [2 3])
(= (last (__ 100)) 541)
n개의 Prime number를 반환하는 함수를 작성하는 것.
함수형 프로그래밍에서는 에라토스테네스의 체 방법이 자주 등장한다. (Haskell 홈페이지에 나와 있기도 하다.)
<http://haskell.org> |
"체"를 naiive하게 풀어낸 코드.
;; 146
(fn [n]
(let [from (fn [n] (map #(+ n %) (range)))
sieve (fn s[ps]
(let [p (first ps)]
(lazy-seq (cons p (s (filter #(not= 0 (mod % p)) (rest ps)))))))]
(take n (sieve (from 2)))))
솟수를 찾아나가는 (loop/recur) 코드.
;;98
(fn [n]
(loop [x 2
a []]
(cond
(= (count a) n) a
(some #(= 0 (mod x %)) a) (recur (inc x) a)
:else (recur (inc x) (conj a x)))))
여기선 (cond)보다 (if)가 간결하다.
;; 93
(fn [n]
(loop [x 2
a []]
(if (= (count a) n)
a
(if (some #(= 0 (mod x %)) a)
(recur (+ 1 x) a)
(recur (+ 1 x) (conj a x))))))
마지막 (recur) 두 개는 하나로 합칠 수 있다.
;; 81
(fn [n]
(loop [x 2
a []]
(if (= (count a) n)
a
(recur (+ 1 x)
(if (some #(= 0 (mod x %)) a)
a
(conj a x))))))
문제의 호출 형식을 이용하여 loop 인자를 함수로 옮겼다.
;; 74
(fn [x a n]
(if (= (count a) n)
a
(recur (+ 1 x)
(if (some #(= 0 (mod x %)) a)
a
(conj a x))
n)))
2
[]
댓글 없음:
댓글 쓰기