2

我想知道,给定字符串n*3/7+9-5,我可以从中得到多项式,作为数组或字符串,例如[4, 3/7]. 我该怎么做呢?

此外,还有一个库允许我将它变成这样的字符串:subtract(add(divide(multiply(n,3),7),9),5),如果有帮助的话。

另外,我正在使用 Javascript 和 Objective-C(服务器和客户端),如果这有帮助的话。

我尝试将每个操作表示为一个对象,并将它们存储在一个数组中,然后按操作顺序对数组进行排序,并评估每个操作,并使用它,但我真的迷路了,不知道如何制作这行得通。

如果您需要更多信息,请告诉我。

n*3/7+9-5我的问题是,转换为多项式( )的好算法是什么[4, 3/7]

谢谢,阿里

4

1 回答 1

5

有两个步骤:解析和微分/简化。

有多种方法可以进行解析。您可以使用现有的东西,或者我所做的是一个简单的递归下降解析器。无论哪种方式,结果都是解析树数据结构。

为了区分/简化,可以编写相当简单的递归函数。

(如果您只需要答案,我是Maxima的忠实粉丝。)

否则,您可以编写以下内容:

简化器:这将解析树作为输入,并通过应用如下规则生成一个新的解析树:
- 任何乘以 0 为零
- 任何乘以 1 都是那个东西
- 任何加 0 就是那个东西
- 任何数值加/减任何其他是只是一个新的数值
- 任何数值乘以/除以任何其他只是一个新的数值

替换:这需要一个解析树 A,一个类似“n”的标记名称,以及另一个树 B,遍历树 A,并且在出现“n”的任何地方,将其替换为 B 的副本。结果是 A 的副本全部“ n"s 替换为 B 的副本。

因此,例如,要获得表达式的常数部分,您可以将“n”替换为零并简化结果。所有带有“n”的项都将退出,留下常数。

要通过“n”进行区分,您可以使用基本规则:
- d(n) = 1
- d(任何不包含 n) = 0
- d(a +/- b) = d(a) +/- d( b)
- d(a * b) = b d(a) + a d(b)
- d(a / b) = (b d(a) - a d(b))/(b^2)

因此,对于 n^2 以内的项,总体策略可能是:
- 用 x 替换 n^2,用 x 微分,得到的常数 q 是 n^2 的因数。
- 对原始表达式,减去 q n^2 并化简。那是减去 n^2 项的新表达式。
- 现在用 n 来区分它,得到的常数 p 是它的因子。
- 减去 p
n 并简化,以产生最终的加法常数 r。

您可以通过编写一个简单的计算器来解释解析树来查看它是否正确。只需将一个奇怪的 n 值插入原始公式,看看你得到了什么。如果你解释 (q n^2 + p n + r),你应该得到同样的结果。

害怕的?它比看起来更容易,并且是一项很棒的技能。

编辑:这是千里马:

在此处输入图像描述

历史:Maxima 起源于 Macsyma(MAC 符号操作),始于 70 年代初在麻省理工学院 AI 实验室,基于 MacLisp 并从 Joel Moses 的符号集成程序开始。它可以做代数、微分和积分、矩阵和张量数学、微分方程等等。

于 2013-08-31T20:04:47.450 回答