Я пытаюсь написать функцию, которая возвращает memoized рекурсивную функцию в Clojure, но у меня возникают проблемы с тем, чтобы рекурсивная функция отображала свои собственные memoized привязки. Это потому, что не создано var? Кроме того, почему я не могу использовать memoize для локальной привязки, созданной с let?Как создать memoized рекурсивные функции в Clojure?
Этот необычный в последовательности Фибоначчи производитель, который начинается с конкретного номера является примером того, что я хотел бы сделать:
(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!?!
Я мог бы, конечно, вручную написать макрос, который создает атом замкнутых над и управлять запоминанию себя, но я надеялся сделать это без такой повозки, запряженных волов.
Решение, данное @Phelix и @CarlosNunes, находится на странице [ClojureDocs для 'memoize'] (http://clojuredocs.org/clojure.core/memoize). – Thumbnail