Podając liczbę całkowitą n
, w jaki sposób mogę utworzyć listę zawierającą wszystkie listy o długości n^2
zawierające dokładnie n
kopii każdej liczby całkowitej x < n
? Na przykład, dla n = 2
, mamy:Jak skutecznie generować wszystkie listy o długości `n^2` zawierające` n` kopie każdego `x <n`?
[0,0,1,1], [0,1,0,1], [1,0,0,1], [0,1,1,0], [1,0,1,0], [1,1,0,0]
Można to łatwo zrobić łącząc permutations
i nub
:
f :: Int -> [[Int]]
f n = nub . permutations $ concatMap (replicate n) [0..n-1]
Ale to jest zbyt nieefektywne. Czy istnieje prosty sposób kodowania efektywnego/bezpośredniego algorytmu?
mogę myśleć bez bezpośredniej metody, jednak chciałbym zacząć pisać 'interleavings :: [a] -> [a] -> [[a] ] '. Potem użyłbym czegoś takiego (untested) 'f n = go n gdzie id m = interleavings (replicate n m) = << go (m-1); idź 0 = [powtórz n 0]. (Niezbyt elegancko, zgadzam się.) – chi