意外地减慢了Clojure中的memoized功能

时间:2014-04-13 04:11:09

标签: recursion clojure memoization

在练习Clojure时,我正在努力递归计算只能在图表上向右或向下行进的步行(来自Project Euler)。这是一个微不足道的问题,但我想尝试不同的方法来解决问题。

(defn path-count [x y] (cond
                     (or (< y 0) (< x 0)) 0
                     (= y 0) 1
                     :else (+ (path-count x (- y 1))
                              (path-count (- x 1) y))))

(def path-count-memoized (memoize path-count))

(defn cartesian-range [min max]
(for [y (range min max)
      x (range min max)]
     [x y]))

(map 
  (fn [pair] 
    (path-count-memoized 
      (nth pair 0) 
      (nth pair 1))) 
  (cartesian-range 0 20))

看着它,看起来它应该渐近地执行类似于以(0,0)开始的使用20x20阵列的迭代解决方案。但是,它非常慢。我不知道我哪里出错了。我以为我误解了memoization缓存如何工作[或达到大小限制 - 虽然看起来很荒谬],或者我误解了map评估惰性序列条款的顺序。 / p>

1 个答案:

答案 0 :(得分:2)

path-count不会在其自身内部调用path-count-memoize,因此您实际上并没有获得太多的memoization。设置它有点棘手,这里有几种技术可以找到:

How do I generate memoized recursive functions in Clojure?

相关问题