算术表达式求值 oz mozart
Arithmetic expression evaluation oz mozart
我有一个问题,我真的不知道如何在 OZ 中实现它:
假设给你一个由元组构造的树描述的算术表达式,如下所示:
- 整数由元组 int(N) 描述,其中 N 是整数。
- 加法由元组 add(X Y) 描述,其中 X 和 Y 都是算术表达式。
- 乘法由元组 mul(X Y) 描述,其中 X 和 Y 都是算术表达式。
实现一个接受算术表达式和returns其值的函数 Eval。
例如,add(int(1) mul(int(3) int(4)))
是一个算术表达式,它的求值是returns 13.
很遗憾你到目前为止没有展示你的尝试。
总之。通常,在处理此类问题时,您会考虑递归。而pattern matching是分析表达式的好方法。
例如,如果您能够评估 int(4)
那么很明显如何使用简单的递归评估 add(int(4) int(4))
:
declare
proc {Eval Exp Res}
case Exp
of int(N) then Res = N
[] add(X Y) then
local R1 R2 in
{Eval X R1}
{Eval Y R2}
Res = R1 + R2
end
end
end
现在您可以使用 mul
或任何其他表达式展开它。
我有一个问题,我真的不知道如何在 OZ 中实现它: 假设给你一个由元组构造的树描述的算术表达式,如下所示:
- 整数由元组 int(N) 描述,其中 N 是整数。
- 加法由元组 add(X Y) 描述,其中 X 和 Y 都是算术表达式。
- 乘法由元组 mul(X Y) 描述,其中 X 和 Y 都是算术表达式。
实现一个接受算术表达式和returns其值的函数 Eval。
例如,add(int(1) mul(int(3) int(4)))
是一个算术表达式,它的求值是returns 13.
很遗憾你到目前为止没有展示你的尝试。
总之。通常,在处理此类问题时,您会考虑递归。而pattern matching是分析表达式的好方法。
例如,如果您能够评估 int(4)
那么很明显如何使用简单的递归评估 add(int(4) int(4))
:
declare
proc {Eval Exp Res}
case Exp
of int(N) then Res = N
[] add(X Y) then
local R1 R2 in
{Eval X R1}
{Eval Y R2}
Res = R1 + R2
end
end
end
现在您可以使用 mul
或任何其他表达式展开它。