프로그래밍 검색 블로그

clojue fibonacci / memoize 본문

clojure기초

clojue fibonacci / memoize

코딩조무사 2017. 10. 29. 00:49

피보나치 수열을 clojure로 만들어보자


일반적으로 피보나치 수열은 C++로 

이런 방식으로 만들수 있는데 (코드가 비효율적인 것은 일단 논외로) 

1
2
3
4
5
int fibo(int a){
    if(a == 0return 1;
    if(a == 1return 1;
    return fibo(a - 1+ fibo(a - 2);
}
cs



이걸 일단 그대로 clojure 로 옮겨보면 

1
2
3
4
5
(defn fibo [n]
      (case n
            0 1
            1 1
            (+ (fibo (- n 1)) (fibo (- n 2)))))
cs


이렇게 나올수 있다 


이걸 clojure에서는 memoize 함수를 사용해서 저장시킬수 있다 

C++로 비슷하게 생각해보면 아마 이렇게 될것이다


1
2
3
4
5
6
7
8
int mem[100= {1,1,};
int fibo(int a){
    if(a == 0return 1;
    if(a == 1return 1;
    if(mem[a] == 0)
        mem[a] = fibo(a - 1+ fibo(a - 2);
    return mem[a];
}
cs




memoize 사용 

1
2
3
4
5
6
(def fibo
  (memoize
    #(case  %1
            0 1
            1 1
            (+ (fibo (dec %1)) (fibo (- %1 2))))))
cs



defn 이 아니라 그냥 def 변수로 설정해서 memoize를 할당하였다 


함수는 람다식으로 하였는데 보기 불편하거나 약간 복잡해지면 fn으로 바꿔서 일반 함수로 만들어도 똑같이 동작한다 


'clojure기초' 카테고리의 다른 글

clojure 오버로딩 2 (defmulti / defmethod)  (0) 2017.10.29
clojue fibonacci / lazy-seq  (0) 2017.10.29
clojure 오버로딩  (0) 2017.10.28
clojure java와 연결  (0) 2017.10.28
clojure 함수형 프로그래밍 3 (apply)  (0) 2017.10.26
Comments