gpt4 book ai didi

loops - 在 Clojure 中退出循环

转载 作者:行者123 更新时间:2023-12-01 12:50:08 25 4
gpt4 key购买 nike

我想跳出下面的循环,并在第 10 行计算结果为真时返回最佳最小移动。我查看了带有 print 语句的输出,当第 10 行的计算结果为真时,它找到了我正在寻找但继续重复出现的数据。在 Clojure 中,有没有一种方法可以在语句计算结果为真时停止循环?或者我应该使用循环以外的东西吗?

(defn minimax [board max-mark min-mark depth best-score] 
(loop [board board
max-mark max-mark
min-mark min-mark
depth depth
best-score best-score]
(if (= best-score (best-min-score board max-mark min-mark depth))
(best-max-move board max-mark min-mark depth)
(do
(if (= best-score (best-min-score board min-mark max-mark depth))
(best-min-move board min-mark max-mark depth)
(recur
(b/make-move-on board (remaining-scores board max-mark min-mark depth) max-mark)
min-mark
max-mark
(inc depth)
(dec best-score)))))))

最佳答案

关于循环

  • 循环的不是loop:它是recur
  • loop 是一个let,它形成一个recur 点。
  • 您不会也不能跳出循环:recur 将您打断。

loop 相当于设置并调用一个匿名函数。例如

(loop [n 5, s "Hello, world!"]
(if (zero? n)
(first s)
(recur (dec n) (rest s))))

...等同于

((fn [n s]
(if (zero? n)
(first s)
(recur (dec n) (rest s))))
5 "Hello, world!")

由于性能有所损失,loop 可以编写为执行上述转换的宏。


至于你的代码:

这里有六个未定义的函数。为了清除编译,我们

(declare best-min-score 
best-max-move
best-min-move
best-max-move
make-move-on
remaining-scores)

还有两种多余的形式。这些不会造成积极的伤害,但会使代码模糊不清。

  • 不需要loop:函数本身是合适的recur 的目标。
  • do 什么都不做:它包含一个表单。

你的功能减少到

(defn minimax [board max-mark min-mark depth best-score] 
(if (= best-score (best-min-score board max-mark min-mark depth))
(best-max-move board max-mark min-mark depth)
(if (= best-score (best-min-score board min-mark max-mark depth))
(best-min-move board min-mark max-mark depth)
(recur
(make-move-on board (remaining-scores board max-mark min-mark depth) max-mark)
min-mark
max-mark
(inc depth)
(dec best-score)))))

虽然任何未定义的函数都可能重复出现,但最好的选择是 best-min-move

关于loops - 在 Clojure 中退出循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26412033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com