为什么递归函数没有被记忆
Why recursive function is not memoized
你好,我无法解决这个问题:
(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 消息。
为什么会这样?如何解决这个问题?
两个问题。 1) 每次调用 integrate
都会创建一个新的记忆函数,因此第二次调用 integrate
不会重用第一次调用计算的任何结果。 2) 记忆函数的参数之一本身就是一个函数。 (= (fn []) (fn []))
并非如此,因此备忘录可能不会像您希望的那样经常匹配。
你可以在这里找到关于这个问题的好文章 write-up:https://quanttype.net/posts/2020-09-20-local-memoized-recursive-functions.html
你好,我无法解决这个问题:
(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 消息。
为什么会这样?如何解决这个问题?
两个问题。 1) 每次调用 integrate
都会创建一个新的记忆函数,因此第二次调用 integrate
不会重用第一次调用计算的任何结果。 2) 记忆函数的参数之一本身就是一个函数。 (= (fn []) (fn []))
并非如此,因此备忘录可能不会像您希望的那样经常匹配。
你可以在这里找到关于这个问题的好文章 write-up:https://quanttype.net/posts/2020-09-20-local-memoized-recursive-functions.html