我有一个(假设的)问题,我认为解决方案是动态生成代码。
我想快速评估用户输入的任意数学函数,比如找到i ^ 3 + 2i ^ 2 + 6i + 1的和i = 1到 N 。 N 是任意的,i ^ 3 + 2i ^ 2 + 6i + 1也是任意的(它不必是多项式,它也可能包含三角函数和其他函数)。假设N可能非常大。我想知道如何快速评估答案,假设我已经将用户输入解析为某些字节码或我的程序可以理解的其他内容。
如果可能的话,我也希望我的代码能够轻松编译并在不同的操作系统(包括移动设备)上运行。
我想到了几个方法:
1)编写一个解释器,解释并执行我的字节码中的每个命令。这使我可以自由使用任何语言,但速度很慢。
2)用Java / C#编写并使用动态代码生成(例如Is it possible to dynamically compile and execute C# code fragments?)。这将像我在源代码中直接编写函数一样快速执行,只是稍微减慢,因为C#/ Java都是JIT编译为机器代码。限制是Java在移动设备上不受广泛支持,而C#仅支持Windows。
3)为我使用的任何编译语言嵌入汇编程序/ C ++编译器/编译器。限制是它也无法在移动设备上运行 - 它不会让我执行数据文件。
4)编写HTML / Javascript然后将其嵌入到Web浏览器控件中并将其放入应用程序中(我认为这是一些人用来制作可在任何地方运行的通用应用程序的方式)。但它也很慢,在Javascript中编写真正的应用程序很痛苦。
您认为哪种选择最合适?或者也许我应该混合使用,也许我的应用程序代码将创建并执行生成的Javascript函数?
答案 0 :(得分:0)
对大N值执行这些计算的最快最简单的方法是使用原始数学而不是重复求和。
这是一个计算表达式中每个单独项目的公式,对表达式中的所有项目执行此操作,您就完成了:
H [n]是第n Harmonic number。
计算H [n]有多种方法。有些人计算出所需的最大数量并生成所有数字,保存所需的任何其他值... 交替地将系列中的每10,000个项目存储在一个文件中,并从最近的条目计算H [n]。