2012-01-27 9 views
1

私はハスケルで新しいです。私は、整数のリストを取る関数を書く必要があり、恒等置換を受け取るために必要な構成の数を返します。次のようなものがあります:ハスケル:順列の順

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

+0

それを分離したサイクルに分割するには、最も簡単な方法は、最初のリストのペアを返す関数 'pick ::(a - > Bool) - > [a] - >未定義(a、[a])'要素をテストに適合させ、リストの残りの部分、 'pick even [1,3,4,5,6] = Just(4、[1,3,5,6]) 'のように、最初の素子。反復処理では、すべてのサイクルのリストが表示されます。 –