【问题标题】:Haskell: order of permutationHaskell:排列顺序
【发布时间】:2012-01-27 14:39:25
【问题描述】:

我是 Haskell 的新手。我必须编写函数来获取整数列表并返回接收身份排列所需的组合数。类似的东西:

permutationOrder :: [Int] -> Int

如果有任何帮助,我将不胜感激。

【问题讨论】:

    标签: list math haskell permutation


    【解决方案1】:

    假设列表包含从0n-1的数字,以某种顺序,

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

    为您提供排列图。从图中,您可以通过将其划分为连接的组件(对应于排列组成的循环)来轻松计算顺序。循环的顺序是循环中元素的数量。不相交循环通勤,这使得计算不相交循环乘积的顺序变得容易。

    【讨论】:

    • 感谢您的快速回复。所以现在我有一对列表,例如:[(1,6),(2,4),(3,1),(4,3),(5,7),(6,2),(7, 5)],接下来我要合并它[(1,6,2,4,3),(5,7)]。接下来我需要计算每个循环的长度并找到它们的最小公倍数,对吗?对我来说最困难的是如何将它们合并成不相交的循环。
    • 对。要将其拆分为不相交的循环,最简单的方法是使用函数pick :: (a -> Bool) -> [a] -> Maybe (a, [a]),它返回满足测试的第一个列表元素和列表的其余部分的对,如pick even [1,3,4,5,6] = Just (4,[1,3,5,6]),从第一个找到循环元素。迭代为您提供所有循环的列表。
    猜你喜欢
    • 2023-03-18
    • 2021-09-04
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2019-01-08
    • 2014-02-14
    相关资源
    最近更新 更多