我想写一个函数,它允许我在js中"求解"一个方程.
我想要的(不是编程语言):
function f(x) { 1 + x * x }
var z = 2
var y = f(z) //y will be 5 as a number
Run Code Online (Sandbox Code Playgroud)
我在JS写的:
function P(cfg) { ....
this.equation = "1 + x";
....};
P.prototype.eqn = function(x) {
var tmp = eval(this.equation);
return tmp;
};
....
P.prototype.draw = function() {....
for(var i = 0; i < z; i++)
ctx.lineTo(i, this.eqn(i));
....};
Run Code Online (Sandbox Code Playgroud)
我也读到在循环中使用eval可能不是一个好主意,但我还没有想出另一种方式(尚未)(JS初学者)......
这段代码的问题是,至少在FF中,var tmp将STILL包含来自this.equation的字符串而不是计算值.
我非常感谢任何进一步的见解!
感谢您的时间 :)
编辑:因为我的问题没有很好地阐述:执行行var tmp = eval(this.equation)之后; var tmp将保存一个STRING,它等于字符串this.equation,而不是所需的解y值.此外,我不是说解决,但评估,谢谢你的提示:)
根据您的示例,我想说您想要“评估表达式”,而不是“求解方程”。对于计算表达式,您可能可以找到很多教程。不过我会简单地分解一下。您需要执行几个步骤。
从字符串“1 + x * x”开始,您需要将其分解为标记。具体来说,将其分解为:"1", "+", "x", "*", "x"
。此时,您可以将变量(“x”)替换为其文字值(“2”),得到"1", "+", "2", "*", "2"
现在您需要解析该表达式。根据PEMDAS 的运算顺序,您需要创建一个树形数据结构,其中先执行括号子句(括号包围的内容),然后执行乘法和除法,最后执行加法和减法。解析通常不是一件容易的任务,您可能想要组合一个更简单的 BNF 语法(尽管您可能可以通过一些谷歌搜索找到简单数学表达式的语法)。
接下来,以深度优先的方式遍历树,在沿着树向上移动时评估操作。一旦到达树顶,您就有了解决方案。
如果你想“解方程”,你将需要更复杂的东西,比如Sage
归档时间: |
|
查看次数: |
9337 次 |
最近记录: |