Los vectores se definen usando tablas como sigue:
type Vector a = Array Int a |
Un elemento de un vector es un máximo local si no tiene ningún elemento adyacente mayor o igual que él.
Definir la función
posMaxVec :: Ord a => Vector a -> [Int] |
tal que (posMaxVec p) devuelve las posiciones del vector p en las que p tiene un máximo local. Por ejemplo,
posMaxVec (listArray (1,6) [3,2,6,7,5,3]) == [1,4] posMaxVec (listArray (1,2) [5,5]) == [] posMaxVec (listArray (1,1) [5]) == [1] |
Soluciones
import Data.Array type Vector a = Array Int a -- 1ª definición posMaxVec :: Ord a => Vector a -> [Int] posMaxVec p | n == 1 = [1] | otherwise = (if p!1 > p!2 then [1] else []) ++ [i | i <- [2..n-1], p!(i-1) < p!i && p!(i+1) < p!i] ++ (if p!(n-1) < p!n then [n] else []) where (_,n) = bounds p -- 2ª definición posMaxVec2 :: Ord a => Vector a -> [Int] posMaxVec2 p | n == 1 = [1] | otherwise = [1 | p ! 1 > p ! 2] ++ [i | i <- [2..n-1], p!(i-1) < p!i && p!(i+1) < p!i] ++ [n | p ! (n - 1) < p ! n] where (_,n) = bounds p -- 3ª definición posMaxVec3 :: Ord a => Vector a -> [Int] posMaxVec3 p | n == 1 = [1] | otherwise = [i | i <- [1..n], all (<p!i) [p!j | j <- vecinos i]] where (_,n) = bounds p vecinos 1 = [2] vecinos j | j == n = [n-1] | otherwise = [j-1,j+1] -- 4ª definición posMaxVec4 :: Ord a => Vector a -> [Int] posMaxVec4 p = [i | (i,x) <- assocs p , i == a || p!(i-1) < x , i == b || p!(i+1) < x ] where (a,b) = bounds p |
Para el tercer ejercicio no me funciona esa solución, creo que habría que añadirle esto:
import Data.Array
type Vector a = Array Int a
posMaxVec :: Ord a => Vector a -> [Int]
posMaxVec p | snd ( bounds p) == 1 = [1]
|otherwise =filter q (indices p)
–El resto exactamente igual a lo tuyo.