最终我想要做到这一点:
2x + 3 = 5
通过先从两边减3得到2x = 2
,然后再将两边同时除以2得到x = 1
,解出x。我一直在思考如何用JavaScript编写一个可以返回按顺序完成的步骤及结果数组的函数。显然,“eval”无法实现此功能,因此我们似乎必须重新创建等式。
起初,我想先忽略X,只尝试编写一个可以解决简单等式的函数,而不使用eval或任何内置函数。
我认为第一步是使用.split将术语拆分,但我遇到了一些问题,因为我需要为多个符号进行拆分。例如,如果我要评估简单表达式:3-6*3/9+5
。因此,在我们进入运算顺序之前,仅拆分每个项(并对其进行分类)就已经很困难了,这也是我目前的主要具体问题。
我最初只是简单地一个接一个地拆分,但我遇到了一些问题,特别是考虑到顺序。
function solve(eq) {
var minuses = eq.split("-"),
pluses = minuses.map(x=> x.split("+")),
timeses = pluses.map(x=>x.map(y=>y.split("*"))),
dividers = timeses.map(x=>x.map(y=>y.map(z=>z.split("/"))));
console.log(minuses, pluses, timeses, dividers);
}
solve("3 - 6 * 3 / 9 + 5");
那么 1) 如何更有效地拆分这些项,而不是为每个项创建一个新变量,并手动递归遍历每个项?看起来我只需要一些类似于最后一个示例中的“分隔符”数组的字典来跟踪操作的顺序(现在不考虑括号或指数):
["*","/","+","-"]
-- 并且根据该数组生成类似于上面示例中的最后一个数组的内容(仅包含常数),并以某种方式跟踪存储的数组遵循的元素...2) 如何给定值数组求解表达式? 我有点困惑于逻辑,我想我需要从最后一个数组开始向上解决常量,同时跟踪当前的运算符是哪个,但我不确定具体怎么做。
=
为根节点,然后从右到左移动根节点,同时平衡左右子节点的值。 - blaz