Número de sumas en una expresión aritmética
Las expresiones aritméticas con variables pueden representarse usando el siguiente tipo de datos
1 2 3 4 |
data Expr = C Int | V Char | S Expr Expr | P Expr Expr |
Por ejemplo, la expresión 2·(a+5)
se representa por
1 |
P (C 2) (S (V 'a') (C 5)) |
Definir la función
1 |
sumas :: Expr -> Int |
tal que sumas e
es el número de sumas en la expresión e
. Por ejemplo,
1 2 3 |
sumas (P (V 'z') (S (C 3) (V 'x'))) == 1 sumas (S (V 'z') (S (C 3) (V 'x'))) == 2 sumas (P (V 'z') (P (C 3) (V 'x'))) == 0 |
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
1 2 3 4 5 6 7 8 9 10 |
data Expr = C Int | V Char | S Expr Expr | P Expr Expr sumas :: Expr -> Int sumas (V _) = 0 sumas (C _) = 0 sumas (S x y) = 1 + sumas x + sumas y sumas (P x y) = sumas x + sumas y |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
from dataclasses import dataclass @dataclass class Expr: pass @dataclass class C(Expr): x: int @dataclass class V(Expr): x: str @dataclass class S(Expr): x: Expr y: Expr @dataclass class P(Expr): x: Expr y: Expr def sumas(e: Expr) -> int: match e: case C(a): return 0 case V(x): return 0 case S(e1, e2): return 1 + sumas(e1) + sumas(e2) case P(e1, e2): return sumas(e1) + sumas(e2) assert False |