2017-05-30 81 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