Máximos de expresiones aritméticas
Las expresiones aritméticas se pueden definir usando el siguiente tipo de datos
data Expr = N Int | X | S Expr Expr | R Expr Expr | P Expr Expr | E Expr Int deriving (Eq, Show)
Por ejemplo, la expresión
3*x - (x+2)^7
se puede definir por
R (P (N 3) X) (E (S X (N 2)) 7)
Definir la función
maximo :: Expr -> [Int] -> (Int,[Int])
tal que (maximo e xs) es el par formado por el máximo valor de la expresión e para los puntos de xs y en qué puntos alcanza el máximo. Por ejemplo,
λ> maximo (E (S (N 10) (P (R (N 1) X) X)) 2) [-3..3] (100,[0,1])
Soluciones
data Expr = N Int | X | S Expr Expr | R Expr Expr | P Expr Expr | E Expr Int deriving (Eq, Show) maximo :: Expr -> [Int] -> (Int,[Int]) maximo e ns = (m,[n | n <- ns, valor e n == m]) where m = maximum [valor e n | n <- ns] valor :: Expr -> Int -> Int valor (N x) _ = x valor X n = n valor (S e1 e2) n = (valor e1 n) + (valor e2 n) valor (R e1 e2) n = (valor e1 n) - (valor e2 n) valor (P e1 e2) n = (valor e1 n) * (valor e2 n) valor (E e m ) n = (valor e n)^m