【问题标题】:Algorithm for testing for equivalence of two algebraic expressions测试两个代数表达式等价的算法
【发布时间】:2013-06-29 12:15:47
【问题描述】:

我必须编写一个程序来测试两个代数表达式是否等价。它应该遵循 MDAS 优先级和括号分组。为了解决优先级问题,我想我应该为这些表达式实现一个中缀到后缀符号转换器。但是通过这样做,我无法得出它们的等价性。

程序应如下所示: 用户输入:a*(a+b) = a*a + a*b 输出:等效

对于这个问题,我不允许使用计算机代数系统或任何外部库。如果你有,请不要发布实际代码,我只需要一个想法来解决这个问题。

【问题讨论】:

  • 你能描述一下你的方法是什么不起作用吗?我想如果你把这两个表达式放到同一个标准形式中,你应该可以通过遍历和比较两个树结构来比较它们。
  • 你的程序必须为这两个代数表达式显示什么结果:1/(a-a)2/(a-a)
  • x + ya + b 也相等吗?
  • ^ x+y 和 a+b 不应该相等
  • mbratch 起初我其实是想先将表达式简化为标准形式,但意识到这会很乏味(我猜),而且在识别表达式是否简化时也存在问题。您能否详细说明如何使表达式在程序中成为标准形式?

标签: algorithm math linear-algebra algebra


【解决方案1】:

如果不允许对表达式求值,则必须将它们解析为表达式树。

在那之后,我会通过乘/除所有成员来去掉所有括号,这样 a(b - c) 就变成了 a*b - a*c。

然后将所有表达式转换回字符串,确保所有成员按字母顺序排序(a*b,而不是 b*a),删除所有空格并比较字符串。

【讨论】:

    【解决方案2】:

    这是一个想法:
    您需要先实现构建expression tree,因为它是一种非常自然的表达方式。
    那么也许您需要使用关联或分布代数属性通过开括号等来简化它。
    然后你必须比较树木。这并不明显,因为您需要处理交换操作等中的所有分支排列。例如您可以对它们进行排序(我的意思是分支),然后比较是否相等。您还需要记住可能重命名参数,即 a + b 需要等于 x + y。

    【讨论】:

    • 在构建表达式树时,我是否必须使用后缀符号才能不影响算术优先级?
    • @RomelioTavasJr。是的,最好先转换为前缀或后缀表示法,或者您可以使用这些方法即时构建树
    猜你喜欢
    • 2011-09-03
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 2020-10-16
    相关资源
    最近更新 更多