我正在尝试进行一些alpha-beta修剪,here's an example of an algorithm我可以理解,并且我想到的算法,当我认为自己将如何解决该问题时。
但是我必须用Haskell编写这篇文章,并且正在努力将我的思维方式从过程for循环和变量等转换为Haskell的功能方法。
让我很困扰的部分是如何写
function alphabeta(node, α, β, player) is
.
.
value := −∞
for each child of node do
value := max(value, alphabeta(child, α, β, otherPlayer))
α := max(α, value)
if α ≥ β then
break (* β cut-off *)
return value
.
.
我意识到我可以种折叠进行for-loop,例如
foldl (max ... alphabeta ...) -∞ (children node)
但是我看到我需要在α ≥ β
时退出循环。
我想知道是否可以切换到使用scanl
和dropWhile
,也许像
head $ dropWhile (<b) $ scanl (max ... alphabeta ...) -∞ (children node)
但没有!看来我打算将<em> changing 变量α
与β进行比较。
for循环不断变化并使用(递归)两个不同的变量α
和value
,这就是让我失望的原因,我不知道如何“跟踪”两个不同的变量。相互影响的变量(例如,至少在我看来,找出递归解很困难,因为我可能尝试单变量循环)。
我只是想知道如何做才能更好地了解如何解决此问题。