为什么不记忆递归函数

时间:2020-10-11 17:28:27

标签: clojure

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

(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消息。

为什么会这样?该如何解决?

2 个答案:

答案 0 :(得分:4)

两个问题。 1)每次对integrate的调用都会创建一个新的记忆函数,因此第二次对integrate的调用将不会重用第一次调用所计算的结果。 2)记忆功能的参数之一就是功能本身。 (= (fn []) (fn []))并不正确,因此备忘录可能不如您希望的那样频繁匹配。

答案 1 :(得分:0)

您可以在这里找到有关此问题的出色文章:https://quanttype.net/posts/2020-09-20-local-memoized-recursive-functions.html

相关问题