2012-01-27 157 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