【问题标题】:How to create haskell permutation如何创建haskell排列
【发布时间】:2011-09-05 11:19:31
【问题描述】:

我想要做的是创建一个给定长度的函数,创建所有可能的真/假组合/排列

例如。 getPerm 2 应返回[True,True,True,False,False,True,False,False]

getTrue 0 = []
getTrue size = (True:(getTrue (size-1)))++(True:(getFalse (size-1)))
getFalse 0 = []
getFalse size =(False:(getTrue (size-1)))++(False:(getFalse (size-1)))
getPerm 0 = []
getPerm size= (getTrue size)++(getFalse size)

我做错了..我是函数式编程的新手,所以请只使用基本的东西而不是奇怪的东西..尽量使代码尽可能简单因为我对 Haskell 还不太了解

p>

【问题讨论】:

    标签: function haskell boolean permutation


    【解决方案1】:
    getPerm n = concat $ replicateM n [True, False]
    

    虽然它可能被称为“奇怪的东西”,但它并不太难。 [True, False] 表示列表 monad 中的非确定性选择。 replicateM 列出了这些选择的 n 重复的不确定列表。由于您希望它们都在一个列表中,因此我们将它们连接起来以获得最终结果。

    【讨论】:

    • replicateM 制作n 计算副本并将结果收集到一个列表中。因此,例如replicateM 10 getLine 将读取 10 行并将它们收集到一个列表中。在这里,我在列表 monad 中使用它,因此它会在 TrueFalse 之间重复选择 n 次,并为您提供所有可能的结果列表。
    • 和FUZxxl的方案基本一样,因为replicateM = sequence . replicate
    • 你需要导入Control.Monad
    • 好的,现在它可以工作了,但据我所知, concat $ replicateM n [True, False] 是我复制 [True,False] n 次,然后将它们连接到 1 个列表中,这应该使模式结果像 [True,False,True,False,True,False,True,False,...] 并且不能正常工作:D 对不起,我问了很多,但我真的很想学习 :)
    • 好的,非常感谢我用谷歌搜索并理解了我想要的:) 真的很有帮助:D
    【解决方案2】:

    您可以使用sequence 获得结果:

    getPerm = concat . sequence . flip replicate [True,False]
    

    如果您想为所有排列创建不同的列表,只需删除 concat

    我只是想到了一个更基本的定义。 iterate :: (a -> a) -> a -> [a] 反复应用一个函数并返回中间值:

    getPerm = concat . (iterate permute [[]] !!)
    
    permute xs = map (True:) xs ++ map (False:) xs
    

    所以基本上,permute 生成下一个排列,而 getPerm 只是选择所需的排列。

    【讨论】:

    • 我试过这条线,它工作,但你能解释一下吗?我不明白这是什么。究竟是什么?!翻转复制有点清晰,您使用了 currying 大小。
    • . 是函数组合。即f . g = \x -> f (g x)
    【解决方案3】:

    这是另一个视角。

    getPerm n 将创建 2^n 个排列。生成这些值的另一种方法是简单地从 0 计数到 2^n-1 并将位模式编码为 TrueFalse

    我已更改您的 getPerms 函数的类型以返回列表列表,以便更容易将其分开。

    import Data.Bits
    
    getPerms :: Int -> [[Bool]]
    getPerms n = map (encode n) [0..2^n-1]
    
    encode :: Int -> Int -> [Bool]
    encode bitSize value = map (testBit value) [0..bitSize-1]
    
    *Main> getPerms 2
    [[False,False],[True,False],[False,True],[True,True]]
    

    【讨论】:

    • 好点。您可能需要补充一点,OP 必须以import Data.BitstestBit
    猜你喜欢
    • 2021-05-21
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2011-01-03
    • 2020-09-28
    • 2019-08-14
    相关资源
    最近更新 更多