我發現瞭解決河內塔以下代碼。代碼工作正常! 但我不明白到底發生了什麼事。河內哈斯克爾塔
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