メモ化された再帰関数をClojureで返す関数を作成しようとしていますが、再帰関数に独自のメモ化されたバインディングを表示させるのに問題があります。これは、varが作成されていないためですか?また、letで作成したローカルバインディングでメモ化を使用できないのはなぜですか?
特定の番号で始まるこの少し珍しいフィボナッチ数列メーカーは、私がしたいことの例です。
(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
することは正しいアプローチのように思えますが、それは私にとってもうまくいきません。私は変数を閉じることができないと思いますか?
(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!?!
もちろん、閉じたアトムを作成してメモ化を自分で管理するマクロを手動で作成することもできますが、そのようなハッカーなしでこれを実行したいと考えていました。