2015년 9월 11일 금요일

Living Clojure -- Week 3, Day 4

오늘은 간단하게 한 문제. 늘 빠지지 않는 Prime Number 관련 문제다.

문제 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
[]


댓글 없음:

댓글 쓰기