在练习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>
答案 0 :(得分:2)
path-count不会在其自身内部调用path-count-memoize,因此您实际上并没有获得太多的memoization。设置它有点棘手,这里有几种技术可以找到: