如何创建一个懒惰地为字符“_”和“*”进行排列的函数,如下所示:
例如:
Main> function 3
["___","*__","_*_","__*","**_","_**","*_*","***"]
第一个元素仅来自_
,接下来的3个是列出的排列:*__
,第二个是排列**_
的排列,最后一个元素仅包含*
1}}。
我该怎么做?
答案 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) '_'
我不知道如何在不变的时间内从一个排列到另一个排列。