Bir tam sayı n
verildiğinde, tüm uzunluklarının tümünü içeren listeyi, her bir tam sayı x < n
tam n
kopyasını içeren şekilde nasıl oluşturabilirim? Her `x <n` nin` n` kopyalarını içeren n '2` uzunluklarının tüm listelerini verimli bir şekilde nasıl üretilir?
[0,0,1,1], [0,1,0,1], [1,0,0,1], [0,1,1,0], [1,0,1,0], [1,1,0,0]
Bu
kolaycapermutations
ve
nub
birleştirerek yapılabilir:
f :: Int -> [[Int]]
f n = nub . permutations $ concatMap (replicate n) [0..n-1]
Ama bu yol çok verimsiz Örneğin, n = 2
için, ettik. Verimli/doğrudan algoritmayı kodlamanın basit bir yolu var mı?
, ancak 'interleavings yazmaya başlardım :: [a] -> [a] -> [[a] ] '. Bundan sonra, (test edilmemiş) gibi bir şey kullanacağım. F n = go n nereye giderse m = araya girme (rep n = n) = << go (m-1); 0 = [çoğalt n 0] '. (Çok şık değil, aynı fikirde.) – chi