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 |
Una posible implementación de la función sumas en Haskell podría ser la siguiente:
La función utiliza recursión para recorrer la expresión y acumula el número de sumas en cada nodo. Si el nodo es un C o un V, no tiene sumas y se devuelve 0. Si el nodo es un S, se devuelve la suma de las sumas de los hijos más 1. Si el nodo es un P, se devuelve la suma de las sumas de los hijos.