这是一个典型的公平游戏。两名玩家轮流挑选标有从 1 到 n 的棍子,只要 1 号棍子被选中,游戏就结束。规则很简单:玩家A倒数到5并选择对应的棒子;PlayerA数到2并选择对应的棒。该程序试图找到一个初始点,以便最后选择 1 号棒。
我尝试遍历列表并找到哪个初始位置会给出令人满意的结果,但似乎返回值不正确。代码有什么问题??
fun play(stick) =
let
val stick_list = n_list(stick)
(*n_list(8) will generate an int list [1,2,3,4,5,6,7,8]*)
fun playerA(x::nil, n) = x
| playerA(stick_list, n) =
let
val pos = (n + (5 mod size(stick_list))) mod size(stick_list)
in
playerB(delete(stick_list, pos), pos)
end
and playerB(x::nil, n) = x
| playerB(stick_list, n) =
let
val pos = (n + (~2 mod size(stick_list))) mod size(stick_list)
in
playerA(delete(stick_list, pos), pos)
end
fun search(n) = if playerA(stick_list, n - 1) = 1 then n + 1 else search(n - 1)
in
search(stick - 1)
end;