Menu Close

Mínimos locales

Enunciado

-- 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 [3,2,1,3,7,7,1,0,2] ya que es menor  que 2 (su
-- predecesor) y que 3 (su sucesor). 
-- 
-- Definir la función
--    minimosLocales :: Ord a => [a] -> [a]
-- tal que (minimosLocales xs) es la lista de los mínimos locales de la
-- lista xs. Por ejemplo,
--    minimosLocales [3,2,1,3,7,7,9,6,8]  ==  [1,6]
--    minimosLocales [1..100]             ==  []
--    minimosLocales "mqexvzat"           ==  "eva"

Soluciones

[schedule expon=’2014-11-26′ expat=»06:00″]

  • Las soluciones se pueden escribir en los comentarios hasta el 26 de noviembre.
  • El código se debe escribir entre una línea con <pre lang=»haskell»> y otra con </pre>

[/schedule]

[schedule on=’2014-11-26′ at=»06:00″]

-- 1ª definición (por recursión):
minimosLocales1 :: Ord a => [a] -> [a]
minimosLocales1 (x:y:z:xs) | y < x && y < z = y : minimosLocales1 (z:xs)
                           | otherwise      = minimosLocales1 (y:z:xs)
minimosLocales1 _                           = []
 
-- 2ª definición (por comprensión):
minimosLocales2 :: Ord a => [a] -> [a]
minimosLocales2 xs = 
    [y | (x,y,z) <- zip3 xs (tail xs) (drop 2 xs), y < x, y < z]

[/schedule]

Posted in Medio

2 Comments

  1. Javier Linares Torres
    import Data.List
    import Test.QuickCheck
     
    -- Definicion por comprensión
    minimosLocalesC :: Ord a => [a] -> [a]
    minimosLocalesC xs =
      [ y | (x,(y,z)) <- zip xs ( zip (tail xs) (tail (tail xs))), y<x&&y<z]
     
    -- Definición por recursión
    minimosLocalesR :: Ord a => [a] -> [a]
    minimosLocalesR (x:y:z:xs) | y<x&&y<z = y:minimosLocalesR (y:z:xs)
                               | otherwise = minimosLocalesR (y:z:xs)
    minimosLocalesR _ = []
     
    -- Equivalencia de las dos funciones anteriores
    prop_minimosLocales :: Ord a => [a] -> Bool
    prop_minimosLocales xs = minimosLocalesC xs == minimosLocalesR xs
     
    -- Comprobación: 
    -- *Main> quickCheck prop_minimosLocales
    -- +++ OK, passed 100 tests.
  2. Jesús Navas Orozco
    minimosLocales :: Ord a => [a] -> [a]
    minimosLocales (x:y:z:xs) 
        | y < x && y < z = y : minimosLocales (z:xs)
        | otherwise      = minimosLocales (y:z:xs)
    minimosLocales _ = []

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.