Extremos locales
Un mínimo local de una lista es un elemento de la lista que es menor que su predecesor y que su sucesor en la lista. Por ejemplo, 1 es un mínimo local de [8,2,1,3,7,6,4,0,5] ya que es menor que 2 (su predecesor) y que 3 (su sucesor).
Análogamente se definen los máximos locales. Por ejemplo, 7 es un máximo local de [8,2,1,3,7,6,4,0,5] ya que es mayor que 7 (su predecesor) y que 6 (su sucesor).
Los extremos locales están formados por los mínimos y máximos locales. Por ejemplo, los extremos locales de [8,2,1,3,7,6,4,0,5] son el 1, el 7 y el 0.
Definir la función
extremos :: Ord a => [a] -> [a]
tal que (extremos xs) es la lista de los extremos locales de la lista xs. Por ejemplo,
extremos [8,2,1,3,7,6,4,0,5] == [1,7,0] extremos [8,2,1,3,7,7,4,0,5] == [1,7,0]
Soluciones
-- 1ª definición (por comprensión) -- =============================== extremos1 :: Ord a => [a] -> [a] extremos1 xs = [y | (x,y,z) <- zip3 xs (tail xs) (drop 2 xs), extremo x y z] -- (extremo x y z) se verifica si y es un extremo local de [x,y,z]. Por -- ejemplo, -- extremo 2 1 3 == True -- extremo 3 7 6 == True -- extremo 7 6 4 == False -- extremo 5 6 7 == False -- extremo 5 5 7 == False extremo :: Ord a => a -> a -> a -> Bool extremo x y z = (y < x && y < z) || (y > x && y > z) -- 2ª definición (por recursión) -- ============================= extremos2 :: Ord a => [a] -> [a] extremos2 (x:y:z:xs) | extremo x y z = y : extremos2 (y:z:xs) | otherwise = extremos2 (y:z:xs) extremos2 _ = []