[clojure] 커링된 함수를 이용한 메모이제이션
커링된 함수를 사용하여 메모이제이션을 구현하는 방법에 대해 알아보겠습니다.
커링 (Currying)
커링은 여러 개의 인자를 받는 함수를 단일 인자를 받는 함수들의 연속으로 변환하는 과정입니다. 예를 들어, 두 개의 인자를 받는 함수 add
를 커링하면 두 개의 인자를 받는 함수들의 연속인 add
함수가 됩니다.
(defn add [x y]
(+ x y))
(def add-curried
(partial add))
위의 예제에서는 add
함수를 partial
을 사용하여 커링하여 add-curried
함수를 생성하였습니다.
메모이제이션 (Memoization)
메모이제이션은 함수의 반환값을 저장해 두었다가, 같은 인자가 들어왔을 때는 이전에 저장해 둔 값을 반환하는 기술입니다. 이를 통해 동일한 인자에 대한 함수 호출 시간을 단축할 수 있습니다.
커링된 함수를 이용한 메모이제이션 구현
커링된 함수를 이용한 메모이제이션 구현은 다음과 같습니다.
(defn memoize [f]
(let [mem (atom {})]
(fn [& args]
(if-let [result (@mem args)]
result
(let [result (apply f args)]
(swap! mem assoc args result)
result)))))
위의 코드에서 memoize
함수는 커링된 함수 f
를 받아 메모이제이션된 함수를 반환합니다.
이제 이 메모이제이션된 함수를 사용하여 원래 함수를 호출할 때마다 결과를 저장하고 필요할 때 이전 결과를 반환할 수 있습니다.
이를 통해 함수 호출 시간을 절약할 수 있으며, 중복된 계산을 피할 수 있습니다.
결론
커링된 함수를 사용하여 메모이제이션을 구현하면 함수 호출의 성능을 향상시킬 수 있습니다. 메모이제이션은 동일한 인자에 대한 함수 호출을 최적화하여 중복 계산을 피할 수 있는 유용한 기술입니다.
참고 자료: ClojureDocs - memoize