繁体   English   中英

如何确定数学表达式的求值顺序?

[英]How to determine the order of evaluation of a mathematical expression?

给定一个数学表达式,我想找出可以同时评估的部分。 例如,给定以下表达式,

(a + b) * c - (d + e) / f

(a + b)(d + e)可以同时评估,因为它们彼此独立。

是否有用于此目的的算法? 还是甚至没有实现此功能的库?

是创建数学解析器的简短而逐步的手册。 在解析了表达式之后,您拿着一棵表示已解析表达式的树,可以对其进行迭代,并且在每次迭代中,树的每对叶子将代表一个独立的表达式(可以同时求值)。 [在每次迭代中,将计算出的表达式替换为其结果]

在C#中使用表达式树构建表达式评估器

在此输入图像描述

评估顺序取决于两个因素:

  • 优先级 :每种语言中通常都有一个表,用于指示每种运算符的优先级
  • 关联性 :当一个表达式包含多个具有相同优先级的运算符时,运算符的关联性决定操作的执行顺序。

如果可能存在涉及对表达式的各个部分同时求值的某些优化,我认为只能在JVM / CLR级别而不是在库中完成...

我相信您应该使用波兰语反转符号
阅读以下内容了解更多详情:

这是用C ++编写的函数,可将常规表示法转换为反向波兰语表示法。 有人可能会帮助您将其转换为C#:

好的,让我们将示例视为一棵树:

          -
   (*           /)
(c    +)     (+    f)
   (a   b) (d   e)

(方括号将同一个父节点的两个节点配对)

如果很简单,例如使用Shunting Yard算法获取该树。

现在观察到,评估一个节点所需的只是该节点的子节点(但递归地如此)。 因此,如您所述, (a + b)(d + e)彼此不依赖。 同样(c * (a + b))不依赖于(d + e)((d + e) / f) ,并且((d + e) / f)不依赖于(a + b)

通常,采用节点n ,它既不是n的后代,也不是祖先的任何节点都可以同时求值。 如果您正在使用计划,则必须添加“如果现在可以评估该节点”-显然,您无法在评估其后代之前评估一个节点。

我不确定您指的是什么“目的”。 您要计算什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM