我得到了一个字符串2*x + 5 - (3*x-2)=x + 5
,我需要解决x
。我的想法是将其转换为表达式树,例如,
=
/ \
- +
/\ /\
+ - x 5
/\ /\
* 5 * 2
/\ /\
2 x 3 x
但是,我实际上如何从此处减少树形结构?还有其他想法吗?
您必须使用代数公理来减少它
a * (b + c) -> (a * b) + (a * c)
通过检查通过树中每个节点的类型来完成此操作。将事物完全扩展为术语后,您可以检查它们是否实际上是线性的,等等。
树中的值将是变量或数字。但是,将这些表示为从某些AbstractTreeNode类继承的类并不是很整洁,因为cplusplus没有多个分派。因此最好采用“ c”方式。
enum NodeType {
Number,
Variable,
Addition //to represent the + and *
}
struct Node {
NodeType type;
//union {char*, int, Node*[2]} //psuedo code, but you need
//something kind of like this for the
//variable name ("x") and numerical value
//and the children
}
现在,您可以使用switch case查询它们的节点类型及其子节点。
就像我之前说的那样-C ++惯用代码将使用虚函数,但缺少必要的多重调度来彻底解决此问题。(您仍然需要存储类型)
然后将术语等分组并求解方程。
您可以有一些规则来规范化树,例如
constant + variable -> variable + constant
将x始终放在术语的左边。然后x * 2 + x * 4
可以更容易地简化
var * constant + var * constant -> (sum of constants) * var
在你的例子中...
首先,通过移动术语简化“ =”(按照上述规则)
右侧为-1 *(x + 5),变为-1 * x + -1 *5。左侧将较难-请考虑将a-b替换为a + -1 * b。
最终,
2x + 5 + -3x + 2 + -x + -5 = 0
然后,您可以按所需的方式对术语进行分组。(通过扫描等)
(2 + -3 + -1)x + 5 + 2 + -5 = 0
总结一下,当您拥有mx + c时,将其求解。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句