2017-05-30 85 views
0

我发现了解决河内塔以下代码。代码工作正常! 但我不明白到底发生了什么事。河内哈斯克尔塔

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

你想让我们解释一下Haskell这个函数的语法,河内的解决方案还是两者? – syntagma

回答

2

我会假设你是否理解解决河内问题塔的一般算法。

什么在你的代码,行云上一行:

  1. import Data.Bits我们导入的位操作功能,我们将在我们的例子中使用的有.&..|.shift

  2. hanoi :: Int -> [(Int, Int)]函数带有一个参数(光盘数量)并返回表示移动的对列表(格式:(from, to))。

  3. 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是为什么该函数以这种方式工作的解释。
  4. main = print $ hanoi 5将结果打印在main函数中。
+0

非常感谢您的意见!是的,我正在理解该算法,但我需要了解Haskell。 – Henning

+0

这就是我在我的回答中解释的,希望很清楚。 – syntagma

+0

你可以试着给我一个更简单的答案?,我不明白二进制计算。 – Henning