我正在尝试解决here发现的狮子狼和山羊问题
-- Lions Wolves Goats
-- Lion -> Wolf -> Goat :: -1, -1, +1
-- Lion -> Goat -> Wolf :: -1, +1, -1
-- Wolf -> Goat -> Lion :: +1, -1, -1
-- -------------
-- :: -1, -1, -1
这是我的解决方案如下所示:
eat :: (Int, Int, Int) -> (Int, Int, Int)
eat (lions, wolves, goats) = eat (lions - 1, wolves - 1, goats - 1)
eat (0, wolves, goats) = eat (1, wolves - 1, goats - 1)
eat (lions, 0, goats) = eat (lions - 1, 1, goats - 1)
eat (lions, wolves, 0) = eat (lions - 1, wolves - 1, 1)
eat (0, 0, goats) = (0, 0, goats)
该代码可以编译,但是代码会永远挂起。我很确定我错过了比赛,但我不知道怎么办。请让我知道如何正确解决此问题。
最佳答案
模式是从上至下,从左至右读取的。因此,您的第一个模式与所有其他模式匹配。重新排序:
eat :: (Int, Int, Int) -> (Int, Int, Int)
eat (0 , 0 , goats) = (0 , 0 , goats )
eat (0 , wolves , goats) = eat (1 , wolves - 1 , goats - 1)
eat (lions , 0 , goats) = eat (lions - 1 , 1 , goats - 1)
eat (lions , wolves , 0) = eat (lions - 1 , wolves - 1 , 1 )
eat (lions , wolves , goats) = eat (lions - 1 , wolves - 1 , goats - 1)
请注意,这假设所有值本来都是正值。如果其中之一为负,您仍然会循环。还要注意,您缺少其他“稳定”状态,并且您对非零组合的狮子,狼和山羊的逻辑已关闭。如果有山羊和狼,狮子可能会吃掉它们中的任何一个。此外,狼可能会比狮子先吃山羊。
这就是不确定性将发挥作用的部分。
关于haskell - 解决狮子,狼和山羊,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36097043/