User Tools

Site Tools


tips:clojure:fibonacci

피보나치의 구현

단순 버젼

(defn fib [n]
  (if (< n 2) 
      n
      (+ (fib (dec n)) (fib (- n 2)))))
 
(fib 10)
;=> 55
 
(time (fib 37))
;>> "Elapsed time: 10946.491718 msecs"
;=> 24157817

시간 복잡도는 O(n^2)이다.

기억화된 단순 버젼

memorize를 통해 한 번 계산한 것은 저장하여 쓰면, 계산 속도가 빨라진다.

(defn fib [n]
  (if (< n 2) 
      n
      (+ (fib (dec n)) (fib (- n 2)))))
 
(def fib (memoize fib))
 
(time (fib 37))
;>> "Elapsed time: 0.058307 msecs"
;=> 24157817
 
(fib 50)
;>> "Elapsed time: 0.774006 msecs"
;=> 12586269025
 
(fib 100)
;>> ArithmeticException integer overflow

정수 오버플로우가 발생한다.

BigInt를 사용하는 기억화된 단순 버젼

(defn fib [n]
  (cond 
    (= n 0) 0N
    (= n 1) 1N
    :else (+ (fib (dec n)) (fib (- n 2)))))
 
(def fib (memoize fib))
 
(fib 100)
;=> 354224848179261915075N
 
(fib 1000)
;=> StackOverflowError 

스택 오버플로우가 발생한다.

lazy-seq을 이용한 피보나치

(defn fib1 [n]
 (nth ((fn f [a b] (cons a (lazy-seq (f b (+ b a))))) 0N 1N) n))
 
(time (fib 1000))
;>> "Elapsed time: 1.200634 msecs"
;=> 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875N

완성!

tips/clojure/fibonacci.1368627995.txt.gz · Last modified: 2019/02/04 14:26 (external edit)