Producto infinito
Definir la función
1 |
productoInfinito :: [Int] -> [Int] |
tal que (productoInfinito xs) es la lista infinita que en la posición N tiene el producto de los N primeros elementos de la lista infinita xs. Por ejemplo,
1 2 3 |
take 5 (productoInfinito [1..]) == [1,2,6,24,120] take 5 (productoInfinito [2,4..]) == [2,8,48,384,3840] take 5 (productoInfinito [1,3..]) == [1,3,15,105,945] |
Nota: Este ejercicio es parte del examen del grupo 3 del 2 de diciembre.
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
-- 1ª definición (por comprensión): productoInfinito1 :: [Integer] -> [Integer] productoInfinito1 xs = [product (take n xs) | n <- [1..]] -- 2ª definición (por recursión) productoInfinito2 :: [Integer] -> [Integer] productoInfinito2 (x:y:zs) = x : productoInfinito2 (x*y:zs) -- 2ª definición (por recursión y map) productoInfinito3 :: [Integer] -> [Integer] productoInfinito3 [] = [1] productoInfinito3 (x:xs) = map (x*) (1 : productoInfinito3 xs) -- 4ª definición (con scanl1) productoInfinito4 :: [Integer] -> [Integer] productoInfinito4 = scanl1 (*) -- Comparación de eficiencia -- λ> take 20 (show (productoInfinito1 [2,4..] !! 10000)) -- "11358071114466915693" -- (0.35 secs, 98,287,328 bytes) -- λ> take 20 (show (productoInfinito2 [2,4..] !! 10000)) -- "11358071114466915693" -- (0.35 secs, 98,840,440 bytes) -- λ> take 20 (show (productoInfinito3 [2,4..] !! 10000)) -- "11358071114466915693" -- (7.36 secs, 6,006,360,472 bytes) -- λ> take 20 (show (productoInfinito4 [2,4..] !! 10000)) -- "11358071114466915693" -- (0.34 secs, 96,367,000 bytes) |
2 Comentarios