(def fibVal {1 1 2 1})
(defn fibonacci [x]
(if (false? (get fibVal x false))
(do
(println (str "Evaluating " x))
(def fibVal (assoc fibVal x (+ (fibonacci(- x 1)) (fibonacci(- x 2)))))
(println (str x " Evaluated to " (fibVal x)))
(fibVal x)
)
(get fibVal x)
)
)
(斐波那契 5)的输出
评估5
评估4
评估3
3 评估为 2
4 评价为 3
评估3
3 评估为 2
5 评价为 5
5
3 被评估两次,而在内存版本中,它应该只被评估一次。
最佳答案
在除顶级表单之外的任何内容中使用 def
都不是线程安全的,并且不能保证在您使用它时能够正常工作。为了存储像这样变化的状态,您很可能希望使用可变状态选项之一,例如原子、引用或代理。
在这种情况下,原子将是一个不错的选择。
关于clojure - 以下 Clojure 程序有什么问题?斐波那契的内存版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30491711/