Aquest exercici explora la generació exhaustiva de multiconjunts.
Feu una funció
multisets1 :: Int -> Int -> [[Int]] que, donats dos
naturals
i
,
retorni tots els multiconjunts que es poden formar amb
,
de manera que cada nombre aparegui com a molt
vegades.
Feu una funció
multisets2 :: Int -> Int -> Int -> [[Int]] que,
donats tres naturals
,
i
,
retorni tots els multiconjunts que es poden formar amb
,
de manera que cada nombre aparegui entre
i
vegades.
Feu una funció
multisets3 :: Int -> Int -> [[Int]] que, donats dos
naturals
i
,
retorni tots els multiconjunts de
nombres que es poden formar amb
.
Feu una funció
multisets4 :: Int -> Int -> Int -> Int -> [[Int]]
que, donats quatre naturals
i
,
retorni tots els multiconjunts de
nombres que es poden formar amb
de forma que cada nombre aparegui entre
i
vegades.
Per tal que no importi l’ordre en que genereu la solució, els jocs de
proves ordenen el resultat. Per a això, importeu la funció
sort del mòdul Data.List encara que no la feu
servir.
Cada funció puntua 25 punts.
Input
let msort xs = sort (map sort xs) msort $ multisets1 2 3 msort $ multisets2 2 1 4 msort $ multisets3 3 3 msort $ multisets4 3 1 4 6
Output
[[],[1],[1,1],[1,1,1],[1,1,1,2],[1,1,1,2,2],[1,1,1,2,2,2],[1,1,2],[1,1,2,2],[1,1,2,2,2],[1,2],[1,2,2],[1,2,2,2],[2],[2,2],[2,2,2]] [[1,1,1,1,2],[1,1,1,1,2,2],[1,1,1,1,2,2,2],[1,1,1,1,2,2,2,2],[1,1,1,2],[1,1,1,2,2],[1,1,1,2,2,2],[1,1,1,2,2,2,2],[1,1,2],[1,1,2,2],[1,1,2,2,2],[1,1,2,2,2,2],[1,2],[1,2,2],[1,2,2,2],[1,2,2,2,2]] [[1,1,1],[1,1,2],[1,1,3],[1,2,2],[1,2,3],[1,3,3],[2,2,2],[2,2,3],[2,3,3],[3,3,3]] [[1,1,1,1,2,3],[1,1,1,2,2,3],[1,1,1,2,3,3],[1,1,2,2,2,3],[1,1,2,2,3,3],[1,1,2,3,3,3],[1,2,2,2,2,3],[1,2,2,2,3,3],[1,2,2,3,3,3],[1,2,3,3,3,3]]