Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion Clojure中的记忆功能异常缓慢_Recursion_Clojure_Memoization - Fatal编程技术网

Recursion Clojure中的记忆功能异常缓慢

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))

在练习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))
(定义路径计数[xy](条件
(或(

从这个角度看,它的性能应该与使用20x20数组的(0,0)开始的迭代解类似。然而,它的速度非常慢。我不确定我错在哪里。我想我误解了记忆缓存的工作原理[或者达到了大小限制-这看起来很可笑],或者我误解了映射对惰性序列项求值的顺序。

路径计数并没有在其内部调用路径计数记忆,所以实际上没有得到多少记忆。设置这种设置有点棘手,这里有一些技巧:


这里的误解是
memoize
以某种方式“修改”了现有函数。没有。它创建了一个新函数,它是现有函数的一个记忆版本。基本上-然而,我实际上假设了一些稍微不同的东西-由
memoize
创建的函数用记忆版本的递归调用替换了原始函数的递归调用。