我找到了以下用于解决河内塔的代码。代码工作正常! 但我无法理解究竟发生了什么。
import Data.Bits
hanoi :: Int -> [(Int, Int)]
hanoi n = map (\x -> ((x .&. (x-1)) `mod` 3, ((x .|. (x-1)) + 1) `mod` 3)) [1..shift 1 n]
main = print $ hanoi 5
有人可以解释这段代码吗?感谢
答案 0 :(得分:2)
如果你理解解决河内塔问题的一般算法,我会假设。
代码中的内容逐行:
import Data.Bits
我们正在导入位操作函数,我们将在{0}},.&.
和.|.
中使用这些函数。
shift
该函数接受一个参数(光盘数)并返回表示移动的对列表(格式:hanoi :: Int -> [(Int, Int)]
)。
(from, to)
。我们将此函数映射到此列表hanoi n = map ...
,该列表将后续的左移位([1..shift 1 n]
)从1 << n
存储到1
。
3A。对于给定的参数,映射函数(n
mod (\x -> ((x .&. (x-1))
mod 3, ((x .|. (x-1)) + 1)
)返回一对3))
mod (x .&. (x-1))
和3
mod ((x .|. (x-1)) + 1)
,(3)
格式)。 Here解释了函数为什么会这样运作。(from, to)
将结果打印在main = print $ hanoi 5
函数中。