Mayor diferencia progresiva
La diferencia progresiva entre dos elementos de una lista es la resta entre el que ocupa la mayor posición y la menor. Por ejemplo, en la lista [1,5,8,2,9] la diferencia entre los elementos 5 y 8 es 3 y entre 5 y 2 es -3.
Definir la función
1 |
mayorDiferencia :: [Int] -> Int |
tal que (mayorDiferencia xs) es la mayor diferencia progresiva entre los elementos de xs. Por ejemplo,
1 2 3 4 5 |
mayorDiferencia [1,5,8,2,9] == 8 mayorDiferencia [9,5,8,2,1] == 3 mayorDiferencia [7,2,6] == 4 mayorDiferencia [3,2,1] == 0 mayorDiferencia [1..10^7] == 9999999 |
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 |
import Data.List (inits) -- 1ª definición (por recursión): mayorDiferencia :: [Int] -> Int mayorDiferencia ([_]) = 0 mayorDiferencia (x:xs) = max (maximum [y-x | y <- xs]) (mayorDiferencia xs) -- 2ª definición (por comprensión) mayorDiferencia2 :: [Int] -> Int mayorDiferencia2 xs = maximum [x-y | (x,y) <- zip xs (map minimum (tail (inits xs)))] -- 3ª definición: mayorDiferencia3 :: [Int] -> Int mayorDiferencia3 xs = maximum (zipWith (-) xs (scanl1 min xs)) -- 4ª definición: mayorDiferencia4 :: [Int] -> Int mayorDiferencia4 xs = maximum . zipWith (-) xs $ scanl1 min xs -- Comparación de eficiencia -- ghci> mayorDiferencia [1..3000] -- 2999 -- (3.43 secs, 943439560 bytes) -- -- ghci> mayorDiferencia2 [1..3000] -- 2999 -- (3.38 secs, 978359192 bytes) -- -- ghci> mayorDiferencia3 [1..3000] -- 2999 -- (0.01 secs, 2877960 bytes) -- -- ghci> mayorDiferencia4 [1..3000] -- 2999 -- (0.01 secs, 2062616 bytes) |