arithmetic-expressions - 算术表达式评估 oz mozart
问题描述
我有一个问题,我真的不知道如何在 OZ 中实现它:假设给定一个由元组构造的树描述的算术表达式,如下所示:
- 整数由元组 int(N) 描述,其中 N 是整数。
- 加法由元组 add(XY) 描述,其中 X 和 Y 都是算术表达式。
- 乘法由元组 mul(XY) 描述,其中 X 和 Y 都是算术表达式。
实现一个函数 Eval,它接受一个算术表达式并返回它的值。
例如,add(int(1) mul(int(3) int(4)))
是一个算术表达式,它的求值返回13。
解决方案
到目前为止您没有展示您的尝试,这有点令人遗憾。
反正。通常,在处理此类问题时,您会考虑递归。模式匹配是分析表达式的好方法。
例如,如果您能够进行评估,那么如何使用简单的递归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
现在您可以使用或任何其他表达式来扩展它。
推荐阅读
- html - 如何替换字符串中的换行符,以便 html 将其呈现为单独的段落?
- php - 为什么我在 laravel 中收到对成员函数的调用?
- r - 转置表以与 gt::gt() 一起使用
- sql - 如果字符之前存在空格,Laravel 就不会返回结果
- py2app - Objective-c 调用带有多个参数的 python 方法使用 py2app 和 pyobjc
- docker - YAML 与 Anchors ...如何结合?
- python - 在 Django 中的两个模板之间来回传递参数
- powerbi - 如何测试 PowerBI 计划刷新是否有效?
- java - 如何使用 JAVA 泛型避免代码冗余
- algorithm - 为什么堆排序时间复杂度在 CLRS 算法书中的 Big-Oh(N log N) 中给出,而不是在 Theta 中?