Máximos de expresiones aritméticas
Las expresiones aritméticas se pueden definir usando el siguiente tipo de datos
1 2 3 4 5 6 7 |
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
1 |
3*x - (x+2)^7 |
se puede definir por
1 |
R (P (N 3) X) (E (S X (N 2)) 7) |
Definir la función
1 |
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,
1 2 |
λ> maximo (E (S (N 10) (P (R (N 1) X) X)) 2) [-3..3] (100,[0,1]) |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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 |
2 Comentarios