河内塔 Haskell

Tower of Hanoi Haskell

我找到了以下解决河内塔的代码。代码工作正常! 但是我不明白到底是怎么回事。

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

谁能解释一下这段代码?谢谢

如果你理解解决汉诺塔问题的一般算法,我会假设。

您的代码逐行执行的内容:

  1. import Data.Bits 我们正在导入位操作函数,我们将在本例中使用的是 .&..|.shift

  2. hanoi :: Int -> [(Int, Int)] 该函数采用一个参数(圆盘数)和 returns 表示移动的对列表(格式:(from, to))。

  3. hanoi n = map ...。我们将此函数映射到此列表 [1..shift 1 n] 上,该列表存储从 1n 的后续左位移位 (1 << n)。 3a.映射函数((\x -> ((x .&. (x-1))mod3, ((x .|. (x-1)) + 1)mod3)))returns,对于给定的参数,一对(x .&. (x-1))mod3((x .|. (x-1)) + 1)mod3),(格式为 (from, to))。 Here 解释了函数为何如此工作。
  4. main = print $ hanoi 5main 函数中打印结果。