与えられた整数n
は、正確にn
各整数のコピーを含む長さn^2
のすべてのリストを含むリストを作成できますx < n
?例えば、n = 2
のために、私たちはしている:すべての `x <n 'の` n`個のコピーを含む長さ `n^2`のリストを効率的に生成する方法はありますか?
f :: Int -> [[Int]]
f n = nub . permutations $ concatMap (replicate n) [0..n-1]
しかし、それはあまりにも非効率的である:
[0,0,1,1], [0,1,0,1], [1,0,0,1], [0,1,1,0], [1,0,1,0], [1,1,0,0]
これは簡単にpermutations
とnub
を組み合わせて行うことができます。効率的な/直接的なアルゴリズムを簡単にエンコードする方法はありますか?
ノー即時方法を考えることができ、しかし、私は 'インターリービングの書き込みを開始したい:: [A] - > [A] - > [[A] ] '。この後、私は(テストされていない) 'f n = go n where where m = interleavings(replicate n m)= << go(m-1);のようなものを使用します。 go 0 = [複製n 0] '。 (あまりエレガントではない、私は同意する) – chi