我发现了解决河内塔以下代码。代码工作正常! 但我不明白到底发生了什么事。河内哈斯克尔塔
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
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)]
函数带有一个参数(光盘数量)并返回表示移动的对列表(格式:(from, to)
)。
hanoi n = map ...
。我们将这个函数映射到此列表[1..shift 1 n]
上,该函数将随后的左位移(1 << n
)从1
存储到n
。 3)。对于给定参数,映射函数((\x -> ((x .&. (x-1))
mod 3, ((x .|. (x-1)) + 1)
mod 3))
)返回一对(x .&. (x-1))
mod 3
和((x .|. (x-1)) + 1)
mod 3)
(以(from, to)
格式)。 Here是为什么该函数以这种方式工作的解释。main = print $ hanoi 5
将结果打印在main
函数中。
你想让我们解释一下Haskell这个函数的语法,河内的解决方案还是两者? – syntagma