【发布时间】:2015-12-10 03:54:52
【问题描述】:
在我的计算机科学课上,我们使用 Haskell 解决“皇后”问题,您必须在 nxn 板上找到 n 个皇后的所有可能位置。这是我们得到的代码:
queens n = solve n
where
solve 0 = [ [] ]
solve k = [ h:partial | partial <- solve(k-1), h <- [0..(n-1)], safe h partial ]
safe h partial = and [ not (checks h partial i) | i <- [0..(length partial)-1] ]
checks h partial i = h == partial!!i || abs(h-partial!!i) == i+1
但是,第一次输入时,我不小心调换了solve k中的顺序,发现它仍然给出了正确的解决方案,但花了更长的时间:
queens n = solve n
where
solve 0 = [ [] ]
solve k = [ h:partial | h <- [0..(n-1)], partial <- solve(k-1), safe h partial ]
safe h partial = and [ not (checks h partial i) | i <- [0..(length partial)-1] ]
checks h partial i = h == partial!!i || abs(h-partial!!i) == i+1
为什么第二个版本需要这么长时间?我的思考过程是第二个版本在每一步都进行递归,而第一个版本只进行一次递归然后回溯。这不是家庭作业问题,我只是好奇,觉得它会帮助我更好地理解语言。
【问题讨论】:
-
真正的问题是这个类在哪里,为什么不使用 SBV?