Número de variables de una expresión aritmética
Las expresiones aritméticas construidas con una variable (denotada por X
), los números enteros y las operaciones de sumar y multiplicar se pueden representar mediante el tipo de datos Expr definido por
1 2 3 4 |
data Expr = X | C Int | S Expr Expr | P Expr Expr |
Por ejemplo, la expresión X·(13+X)
se representa por
1 |
P X (S (C 13) X) |
Definir la función
1 |
numVars :: Expr -> Int |
tal que numVars e
es el número de variables en la expresión e
. Por ejemplo,
1 2 3 |
numVars (C 3) == 0 numVars X == 1 numVars (P X (S (C 13) X)) == 2 |
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 = X | C Int | S Expr Expr | P Expr Expr numVars :: Expr -> Int numVars X = 1 numVars (C _) = 0 numVars (S a b) = numVars a + numVars b numVars (P a b) = numVars a + numVars b |
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 X(Expr): pass @dataclass class C(Expr): x: int @dataclass class S(Expr): x: Expr y: Expr @dataclass class P(Expr): x: Expr y: Expr def numVars(e: Expr) -> int: match e: case X(): return 1 case C(_): return 0 case S(e1, e2): return numVars(e1) + numVars(e2) case P(e1, e2): return numVars(e1) + numVars(e2) assert False |