Haskell - 如何生成排列

时间:2012-06-29 21:41:27

标签: haskell permutation

如何创建一个懒惰地为字符“_”和“*”进行排列的函数,如下所示:

例如:

Main> function 3
["___","*__","_*_","__*","**_","_**","*_*","***"]

第一个元素仅来自_,接下来的3个是列出的排列:*__,第二个是排列**_的排列,最后一个元素仅包含* 1}}。

我该怎么做?

4 个答案:

答案 0 :(得分:4)

这是另一个“正确的订单”版本:

function :: Int -> [String]
function c = concatMap helper $ zip (reverse [0..c]) [0..c]

helper :: (Int, Int) -> [String]
helper (c,            0)          = [replicate c '_']
helper (0,            c)          = [replicate c '*']
helper (cUnderscores, cAsterisks) = map ('_' :) (helper (cUnderscores - 1, cAsterisks))
                                 ++ map ('*' :) (helper (cUnderscores, cAsterisks - 1))

答案 1 :(得分:4)

您可能需要查看replicateM

答案 2 :(得分:0)

let k = ["_", "*"]
let p = [ a ++ b ++ c | a <- k, b <- k, c <- k ]

答案 3 :(得分:0)

“正确的订单”版本:

import Data.List

function k = concatMap (nub . permutations . pat) [0..k]
  where pat x = replicate x '*' ++ replicate (k-x) '_'

我不知道如何在不变的时间内从一个排列到另一个排列。