2012-01-27 200 views
1

我是Haskell中的新成員。我必須編寫帶有Integer列表的函數,並返回接收身份置換所需的合成編號。類似的東西:Haskell:排列順序

permutationOrder :: [Int] -> Int 

我很感激任何幫助。

回答

2

假設列表中包含的數字從0以某種順序n-1

toPermutationGraph :: [Int] -> [(Int,Int)] 
toPermutationGraph = zip [0 .. ] 

給你置換的曲線圖。從圖中,您可以通過將其分割成連接的組件(對應於組成排列的循環)來輕鬆計算順序。循環次序是循環中元素的數量。不相交週期通勤,這使得計算不相交週期乘積的順序變得容易。

+0

感謝您的快速回復。所以現在我有兩個對的列表:[(1,6),(2,4),(3,1),(4,3),(5,7),(6,2),(7, 5)],接下來我必須將它合併[(1,6,2,4,3),(5,7)]。接下來我需要計算每個週期的長度併爲它們找到最小公倍數,對吧?對我來說最困難的是如何將它們合併成不相交的週期。 – user1173656 2012-01-27 17:10:33

+0

對。要將它分成不相交的循環,最簡單的方法是使用一個函數'pick ::(a - > Bool) - > [a] - > Maybe(a,[a])'返回第一個列表對元素滿足測試和列表的其餘部分,比如'pick even [1,3,4,5,6] = Just(4,[1,3,5,6])',找到第一個循環元件。迭代給你所有周期的列表。 – 2012-01-27 18:38:58