clojure - 以下 Clojure 程序有什么问题?斐波那契的内存版本

标签 clojure

(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/

相关文章:

Clojure:不同类类型上的 defmulti

clojure - Clojure 中是否有内置函数来替换字符串中特定索引处的字符?

map - 将 seq 扩展为单个标量

clojure - 何时评估集合的唯一元素?

clojure - 如何使用 babashka 过滤 tail 的输出

f# - Clojure 和 F# 的 DSL 创建工具是什么?

bash - Clojure shell/sh 不能正确处理单引号参数?

date - 在 Clojure 中获取昨天的日期

unit-testing - Clojure - 测试 Pedestal 路线

tcp - 如何将 (Clojure) Aleph TCP 服务器绑定(bind)到 TCP v4 端口?