河内Haskell塔

时间:2017-05-30 08:29:14

标签: haskell iteration towers-of-hanoi

我找到了以下用于解决河内塔的代码。代码工作正常! 但我无法理解究竟发生了什么。

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 个答案:

答案 0 :(得分:2)

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

代码中的内容逐行:

  1. import Data.Bits我们正在导入位操作函数,我们将在{0}},.&..|.中使用这些函数。

  2. shift该函数接受一个参数(光盘数)并返回表示移动的对列表(格式:hanoi :: Int -> [(Int, Int)])。

  3. (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解释了函数为什么会这样运作。
  4. (from, to)将结果打印在main = print $ hanoi 5函数中。