Producto de los elementos de la diagonal principal
Las matrices se pueden representar como lista de listas de la misma longitud, donde cada uno de sus elementos representa una fila de la matriz.
Definir la función
1 |
productoDiagonalPrincipal :: Num a => [[a]] -> a |
tal que (productoDiagonalPrincipal xss) es el producto de los elementos de la diagonal principal de la matriz cuadrada xss. Por ejemplo,
1 2 3 |
productoDiagonal1 [[3,5,2],[4,7,1],[6,9,8]] == 168 productoDiagonal1 (replicate 5 [1..5]) == 120 length (show (productoDiagonal3 (replicate 30000 [1..30000]))) == 121288 |
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
import Data.List (genericReplicate) -- 1ª solución -- =========== productoDiagonal1 :: Num a => [[a]] -> a productoDiagonal1 xss = product (diagonal1 xss) -- (diagonal1 xss) es la diagonal de la matriz xss. Por ejemplo, -- diagonal1 [[3,5,2],[4,7,1],[6,9,0]] == [3,7,0] -- diagonal1 [[3,5],[4,7],[6,9]] == [3,7] -- diagonal1 [[3,5,2],[4,7,1]] == [3,7] diagonal1 :: [[a]] -> [a] diagonal1 ((x:_):xss) = x : diagonal1 (map tail xss) diagonal1 _ = [] -- 2ª solución -- =========== productoDiagonal2 :: Num a => [[a]] -> a productoDiagonal2 = product . diagonal1 -- 3ª solución -- =========== productoDiagonal3 :: Num a => [[a]] -> a productoDiagonal3 = product . diagonal3 diagonal3 :: [[a]] -> [a] diagonal3 xss = [xs !! k | (xs,k) <- zip xss [0..n]] where n = length (head xss) - 1 -- 4ª solución -- =========== productoDiagonal4 :: Num a => [[a]] -> a productoDiagonal4 [] = 1 productoDiagonal4 [[]] = 1 productoDiagonal4 ((x:_):xss) = x * productoDiagonal4 (map tail xss) -- 5ª solución -- =========== productoDiagonal5 :: Num a => [[a]] -> a productoDiagonal5 xss = product (zipWith (!!) xss [0..k]) where m = length xss n = length (head xss) k = min m n - 1 -- Comparación de eficiencia -- ========================= ejemplo :: Integer -> [[Integer]] ejemplo n = genericReplicate n [1..n] -- La comparación es -- λ> length (show (productoDiagonal1 (ejemplo 7000))) -- 23878 -- (1.23 secs, 3,396,129,424 bytes) -- λ> length (show (productoDiagonal2 (ejemplo 7000))) -- 23878 -- (0.94 secs, 3,396,127,680 bytes) -- λ> length (show (productoDiagonal3 (ejemplo 7000))) -- 23878 -- (0.09 secs, 44,841,864 bytes) -- λ> length (show (productoDiagonal4 (ejemplo 7000))) -- 23878 -- (0.96 secs, 3,614,137,840 bytes) -- λ> length (show (productoDiagonal5 (ejemplo 7000))) -- 23878 -- (0.07 secs, 44,168,984 bytes) -- -- λ> length (show (productoDiagonal3 (ejemplo 70000))) -- 308760 -- (8.26 secs, 5,359,752,408 bytes) -- λ> length (show (productoDiagonal5 (ejemplo 70000))) -- 308760 -- (9.34 secs, 5,353,035,656 bytes) |
El código se encuentra en GitHub.
3 Comentarios