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 消息。
为什么会发生这种情况?如何解决这个问题?
解决方案
两个问题。1) 每次调用integrate
都会创建一个新的记忆函数,因此第二次调用integrate
不会重用第一次调用计算的任何结果。2) memoized 函数的一个参数本身就是一个函数。这不是真的(= (fn []) (fn []))
,因此备忘录可能不会像您希望的那样经常匹配。
推荐阅读
- javascript - Apexcharts 在事件中更新 React 状态
- c# - 术语“Get-ADFineGrainedPasswordPolicySubject”未被识别为命令行开关。从 powershell 在 C# 中执行时
- powershell - 如何停止并行线程
- python - 从泊松中为矩阵中的每个值绘制随机变量
- dart - 错误:不能将参数类型“字符串”分配给参数类型“Uri”
- java - 通过 java android 套接字发送图像
- amazon-web-services - 使用气流在 s3 *fast* 中的存储桶内移动文件
- bash - 如何避免访问内置 bash 变量或故意破坏它们
- flutter - Flutter:如何从另一个小部件更改/刷新状态
- python-3.x - 在桌面电话之间建立服务器客户端连接的方法?