Menu Close

Mínimo y máximo de un montículo

Definir la función

   minMax :: Ord a => Monticulo a -> Maybe (a,a)

tal que (minMax m) es justamente el par formado por el menor y el mayor elemento de m, si el montículo m es no vacío. Por ejemplo,

   minMax (foldr inserta vacio [4,8,2,1,5])  ==  Just (1,8)
   minMax (foldr inserta vacio [4])          ==  Just (4,4)
   minMax vacio                              ==  Nothing

Nota: Este ejercicio debe realizarse usando únicamente las funciones de la librería de montículo (I1M.Monticulo) que se describe aquí y se encuentra aquí.

Soluciones

import I1M.Monticulo   -- http://bit.ly/1AKmUQB
 
minMax :: Ord a => Monticulo a -> Maybe (a, a)
minMax m | esVacio m = Nothing
         | otherwise = Just (menor m,mayor m)
 
-- (mayor m) es el mayor elemento del montículo m. Por ejemplo,
--     mayor (foldr inserta vacio [1,8,2,4,5])  ==  8
mayor :: Ord a => Monticulo a -> a
mayor m | esVacio r = menor m
        | otherwise = mayor r
        where r = resto m
 
-- 2ª definición de mayor 
mayor2 :: Ord a => Monticulo a -> a
mayor2 m = last (monticulo2Lista m)
 
monticulo2Lista :: Ord a => Monticulo a -> [a]
monticulo2Lista m | esVacio m = []
                  | otherwise = menor m : monticulo2Lista (resto m)
Inicial

5 soluciones de “Mínimo y máximo de un montículo

  1. Chema Cortés
     
    import I1M.Monticulo
     
    minMax :: Ord a => Monticulo a -> Maybe (a,a)
    minMax m
        | esVacio m     = Nothing
        | otherwise     = Just (menor m, mayor m)
     
    mayor :: Ord a => Monticulo a -> a
    mayor m
        | (not.esVacio.resto) m = (mayor.resto) m
        | otherwise             = menor m
    • Chema Cortés

      Una versión point-free:

      mayor2 :: Ord a => Monticulo a -> a
      mayor2 = menor . head  . dropWhile (not.esVacio.resto) . iterate resto
  2. Jesús Navas Orozco
    import I1M.Monticulo
     
    minMax :: Ord a => Monticulo a -> Maybe (a,a)
    minMax m | esVacio m = Nothing
             | otherwise = Just (menor m,ultimo m)
        where ultimo m | esVacio (resto m) = menor m
                       | otherwise         = ultimo (resto m)
  3. Pedro Martín Chávez
    import I1M.Monticulo
     
    minMax :: Ord a => Monticulo a -> Maybe (a,a)
    minMax m | esVacio m = Nothing
             | otherwise = Just (menor m, mayor m)
             where mayor = menor . until (esVacio . resto) resto
  4. Inma Benítez
    import I1M.Monticulo 
    import Data.Maybe
     
    minMax :: Ord a => Monticulo a -> Maybe (a,a)
    minMax m | esVacio m = Nothing
             | otherwise = Just (a,b)
             where (a,b) = (minimum (monticulo2Lista m),maximum (monticulo2Lista m))
     
    monticulo2Lista :: Ord a => Monticulo a -> [a]
    monticulo2Lista m |esVacio m = []
                      |otherwise = [menor m] ++ monticulo2Lista (resto m)

Escribe tu solución

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