河内塔 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
谁能解释一下这段代码?谢谢
如果你理解解决汉诺塔问题的一般算法,我会假设。
您的代码逐行执行的内容:
import Data.Bits
我们正在导入位操作函数,我们将在本例中使用的是 .&.
、.|.
和 shift
。
hanoi :: Int -> [(Int, Int)]
该函数采用一个参数(圆盘数)和 returns 表示移动的对列表(格式:(from, to)
)。
hanoi n = map ...
。我们将此函数映射到此列表 [1..shift 1 n]
上,该列表存储从 1
到 n
的后续左位移位 (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 解释了函数为何如此工作。
main = print $ hanoi 5
在 main
函数中打印结果。
我找到了以下解决河内塔的代码。代码工作正常! 但是我不明白到底是怎么回事。
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
谁能解释一下这段代码?谢谢
如果你理解解决汉诺塔问题的一般算法,我会假设。
您的代码逐行执行的内容:
import Data.Bits
我们正在导入位操作函数,我们将在本例中使用的是.&.
、.|.
和shift
。hanoi :: Int -> [(Int, Int)]
该函数采用一个参数(圆盘数)和 returns 表示移动的对列表(格式:(from, to)
)。hanoi n = map ...
。我们将此函数映射到此列表[1..shift 1 n]
上,该列表存储从1
到n
的后续左位移位 (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 解释了函数为何如此工作。main = print $ hanoi 5
在main
函数中打印结果。