我正在学习clojure,并实现我的标准测试项目Tic Tac Toe 10。我以前在许多语言中编写过相同的AI,在其他语言中扩展到超过6步时也遇到了问题。
我得到了AI算法的基本工作,但我正在努力提高pmap的速度。因为一切都是不可变的,所以我应该能够直接在pmap中替换map并获得相同的结果,但我没有看到这一点。
(defn get-spot
[board player win-cond levels]
(def avail (get-available board))
(def final
(apply merge
(map #(array-map % (calc-score board player win-cond levels %)) avail)))
final)但该spot中的pmap返回的结果不一致。不知道从哪里开始找。如果需要的话,我可以发布更多的代码。
发布于 2015-04-21 06:54:27
用let everywhere替换def解决了这个问题。如果我不使用let,我的函数会有很多不一致的副作用。
(defn get-spot
[board player win-cond levels]
(let [avail (get-available board)
final (apply merge
(pmap #(array-map % (calc-score board player win-cond levels %)) avail))]
final))我已经写了一堆clojure代码,并且通读了很多教程。我不知道我怎么会错过了这个非常重要的细节。
发布于 2015-04-20 21:12:59
在考虑进行性能调优之前,请先阅读一两本关于clojure的书。在一种语言中内置了不变性并不意味着你可以用pmap替换map。
还有两件事需要考虑,一是代码没有副作用,二是操作必须是可交换的。如果它们不是,则必须在合并算法中考虑这一点。
正如其他人所说,不要在内部函数中创建def绑定,而要使用let。另外,最后一个表达式无论如何都会从函数中返回,所以在返回它之前不需要绑定final。
我很抱歉没有给你一个直接的解决方案,我只是认为你需要理解更换地图并不像看起来那么容易。
如果你仍然想解决你的问题,我想我们需要在这里看到更多的代码。
https://stackoverflow.com/questions/29738620
复制相似问题