首页 > 解决方案 > 为什么没有记忆递归函数

问题描述

您好,我无法解决这个问题:

(defn integrate
  "Finding the definite integral from 0 to stop"
  ([f dx]
   (let [itg (memoize
              (fn [itg stop n]
                (if (<= n 0)
                  0
                  (+ (let [b (* n dx) a (- b dx)]
                       (println "[DEBUG] stop = " stop " and n =" n) 
                       (* (- b a) (/ (+ (f a) (f b)) 2))
                      )
                     (itg itg stop (dec n))))))
         itg (partial itg itg)]
     (fn [x] (itg x (quot x dx))))))

(time ((integrate (fn [x] (* x x)) 0.1) 5))
(time ((integrate (fn [x] (* x x)) 0.1) 5))

我希望我第二次调用此函数时,它应该会达到记忆的结果,但它只是第二次重新计算整个积分并重新打印 DEBUG 消息。

为什么会发生这种情况?如何解决这个问题?

标签: clojure

解决方案


两个问题。1) 每次调用integrate都会创建一个新的记忆函数,因此第二次调用integrate不会重用第一次调用计算的任何结果。2) memoized 函数的一个参数本身就是一个函数。这不是真的(= (fn []) (fn [])),因此备忘录可能不会像您希望的那样经常匹配。


推荐阅读