[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