(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
3評價兩次,而在memoiz ed版本,它應該只被評估一次。以下Clojure程序有什麼問題?斐波那契
謝謝:)這是我的第三方案,Clojure的,所以我不知道多少。 是否可以通過任何方式在運行時更新_fibVal_? 我按順序讀取_do_進程指令,爲什麼它不在這裏發生?我的意思是,即使def不是線程安全的,它也會在返回值之前執行。 –
你是對的。線程安全不在這裏。請注意,'def'是一種特殊的形式,因此它的評估規則和順序是評估者的一個未公開的實現細節,與正常形式不同,所以您不應該依賴它。但是我發現在這種情況下問題確實存在,並且已經相應地更新了答案。 –