【发布时间】:2011-04-23 20:07:26
【问题描述】:
我正在尝试在 Clojure 中编写一个返回记忆化递归函数的函数,但我无法让递归函数看到它自己的记忆化绑定。这是因为没有创建 var 吗?另外,为什么我不能在用 let 创建的本地绑定上使用 memoize?
这个从特定数字开始的稍微不寻常的斐波那契数列生成器就是我希望我能做的一个例子:
(defn make-fibo [y]
(memoize (fn fib [x] (if (< x 2)
y
(+ (fib (- x 1))
(fib (- x 2)))))))
(let [f (make-fibo 1)]
(f 35)) ;; SLOW, not actually memoized
使用with-local-vars 似乎是正确的方法,但它也不适用于我。我想我不能关闭 vars?
(defn make-fibo [y]
(with-local-vars [fib (fn [x] (if (< x 2)
y
(+ (@fib (- x 1))
(@fib (- x 2)))))]
(memoize fib)))
(let [f (make-fibo 1)]
(f 35)) ;; Var null/null is unbound!?!
我当然可以手动编写一个宏来创建一个封闭的原子并自己管理记忆,但我希望在没有这种黑客的情况下做到这一点。
【问题讨论】:
-
@Phelix和@CarlosNunes给出的解决方案在ClojureDocs page for
memoize上。
标签: recursion clojure scope closures memoization