Recursion Clojure中的记忆功能异常缓慢
在练习Clojure时,我正在递归计算只能在图形上向右或向下移动的行走次数(来自Project Euler)。这是一个微不足道的问题,但我想尝试不同的方法来解决这个问题Recursion Clojure中的记忆功能异常缓慢,recursion,clojure,memoization,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))
(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))
(定义路径计数[xy](条件
(或(
从这个角度看,它的性能应该与使用20x20数组的(0,0)开始的迭代解类似。然而,它的速度非常慢。我不确定我错在哪里。我想我误解了记忆缓存的工作原理[或者达到了大小限制-这看起来很可笑],或者我误解了映射对惰性序列项求值的顺序。路径计数并没有在其内部调用路径计数记忆,所以实际上没有得到多少记忆。设置这种设置有点棘手,这里有一些技巧:
这里的误解是
memoize
以某种方式“修改”了现有函数。没有。它创建了一个新函数,它是现有函数的一个记忆版本。基本上-然而,我实际上假设了一些稍微不同的东西-由memoize
创建的函数用记忆版本的递归调用替换了原始函数的递归调用。