2

我有一个(假设的)问题,我认为解决方案是动态生成代码。

我想快速评估用户输入的任意数学函数,比如找到i^3+2i^2+6i+1 的总和 i=1 到N。N是任意的,而 i^3+2i^2+6i+1 也是任意的(它不必是多项式,它也可能包含三角函数和其他函数)。假设 N 可以很大。我想知道如何快速评估答案,假设我已经将用户输入解析为某些字节码或我的程序可以理解的其他内容。

如果可能的话,我还希望我的代码能够轻松编译并在不同的操作系统(包括移动设备)上运行。

我想了几个办法:

1)编写一个解释器来解释和执行我的字节码中的每个命令。这使我可以自由使用任何语言,但速度很慢。

2) 用Java/C# 编写并使用动态代码生成(例如是否可以动态编译和执行C# 代码片段?)。这将像我直接在我的源代码中编写函数一样快地执行,因为 C#/Java 都是 JIT 编译为机器代码的,所以速度会稍微慢一些。限制是 Java 在移动设备上不受广泛支持,而 C# 仅适用于 Windows。

3) 为我使用的任何编译语言嵌入一个汇编器/C++ 编译器/编译器。限制是它也不能在移动设备上运行——它不会让我执行数据文件。

4) 编写 HTML/Javascript,然后将其嵌入 Web 浏览器控件并将其放入应用程序中(我认为这是一些人用来制作可以在任何地方运行的通用应用程序的方式)。但它也很慢,用 Javascript 编写真正的应用程序很痛苦。

你认为哪个选项最合适?或者也许我应该混合使用,也许我的应用程序代码将创建并执行生成的 Javascript 函数?

4

1 回答 1

0

对较大的 N 值执行这些计算的最快和最简单的方法是使用原始数学而不是重复求和。

这是一个计算表达式中每个单独项目的公式,对表达式中的所有项目执行此操作,您就完成了:

对于 x^k,总和 x = 1 到 N

H[n] 是第 n次谐波数

有多种计算 H[n] 的方法。一些计算所需的最大数字并生成所有直到该数字,保存所需的任何其他值...交替地将系列中的每 10,000 个项目存储在一个文件中,并从最近的条目计算 H[n]。

于 2014-09-04T15:02:41.157 回答