JavaScript 后缀数学

标签 javascript evaluation postfix-notation

我遇到了一些关于程序速度的问题,我想知道如何解决它。我接受以下形式的用户输入方程:

"y = 3*x^2 - 2*x"

为了简洁起见,我将使用这个示例。将其转换为 postfix 后,我得到:

[ 3, x, 2, ^, *, 2, x, *, - ]

因此,如果我想绘制图表,我只需创建一个 x 值数组,并找到要通过的线对应的 y 值。但是,如果我可以接受此用户输入并将其转换为如下函数,则该函数的评估速度会更快(这对于制作动画图形至关重要):

function userExpression( x ){
  return 3*Math.pow(x,2)-2*x
}

有什么方法可以将此字符串转换为函数以加快计算速度。我很清楚我可以解析我所做的后缀表达式并且它会起作用,但我相当确定这将成为一个非常糟糕的瓶颈,特别是如果我正在使用 3D 图形.

我有想法将带有 script 标签的 html 注入(inject)到页面中,但我想听听其他人在这种情况下会做什么。另外,我很想听听您如何使用其他语言(例如 C 或 C++、Python 等)来实现这一点。

最佳答案

如果您已经弄清楚如何解析表达式并生成必要的 Javascript 作为字符串,那么您可以通过使用 Function 构造函数创建编译函数来优化性能:

var expression = "return 3 * Math.pow(x, 2) - 2 * x;";
var func = new Function("x", expression);

snippet.log(func(-2));
snippet.log(func(-1));
snippet.log(func(0));
snippet.log(func(1));
snippet.log(func(2));
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

请记住有关 eval() 的所有常见注意事项,因为这实际上并没有那么不同,尽管它应该比 eval() 性能更高,因为函数在全局范围内编译。

关于JavaScript 后缀数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29404569/

相关文章:

parsing - 从中缀转换为后缀然后在数学评估器上构建 AST 是否习惯?

javascript - 了解闭包和方法论

c++ - 将 Stack.top() 添加到 vector 中?

java - 无法理解我需要在 Java while 循环的条件下检查什么

Python - 为后缀表示法列表生成随机操作

javascript - 自动折叠可折叠 block

javascript - Jquery Ui 可排序项目选项仅选择第一项

kotlin - 如何在Kotlin中评估由String表示的 bool 表达式?

javascript - 链接 anchor 文本以打开特定选项卡

javascript - 如何从浏览器中使用默认应用程序打开本地文件?