Ceros con los n primeros números
Los números del 1 al 3 se pueden escribir de dos formas, con el signo más o menos entre ellos, tales que su suma sea 0:
1+2-3 = 0 -1-2+3 = 0
Definir la función
ceros :: Int -> [[Int]]
tal que (ceros n) son las posibles formas de obtener cero sumando los números del 1 al n, con el signo más o menos entre ellos. Por ejemplo,
ceros 3 == [[1,2,-3],[-1,-2,3]] ceros 4 == [[1,-2,-3,4],[-1,2,3,-4]] ceros 5 == [] length (ceros 7) == 8 take 3 (ceros 7) == [[1,2,-3,4,-5,-6,7],[1,2,-3,-4,5,6,-7],[1,-2,3,4,-5,6,-7]]
Soluciones
ceros :: Int -> [[Int]] ceros n = [xs | xs <- candidatos n, sum xs == 0] -- (candidatos n) es la lista de los números del 1 al n con los signos -- más o menos. Por ejemplo, -- λ> candidatos 1 -- [[1],[-1]] -- λ> candidatos 2 -- [[1,2],[1,-2],[-1,2],[-1,-2]] -- λ> candidatos 3 -- [[1,2,3],[1,2,-3],[1,-2,3],[1,-2,-3],[-1,2,3],[-1,2,-3],[-1,-2,3],[-1,-2,-3]] candidatos :: Int -> [[Int]] candidatos n = productoCartesiano [[i,-i] | i <- [1..n]] -- (producto xss) es el producto cartesiano de los conjuntos xss. Por -- ejemplo, -- λ> producto [[1,3],[2,5],[6,4]] -- [[1,2,6],[1,2,4],[1,5,6],[1,5,4],[3,2,6],[3,2,4],[3,5,6],[3,5,4]] productoCartesiano :: [[a]] -> [[a]] productoCartesiano [] = [[]] productoCartesiano (xs:xss) = [x:ys | x <- xs, ys <- productoCartesiano xss] -- 2ª solución ceros2 :: Int -> [[Int]] ceros2 n = [xs | xs <- mapM (\i -> [i,-i]) [1..n], sum xs == 0]