我想知道,给定字符串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]
)的好算法是什么?
谢谢, ARI
答案 0 :(得分:3)
有两个步骤:解析和区分/简化。
有多种方法可以进行解析。你可以使用现有的东西,或者我做的是一个简单的递归下降解析器。 无论哪种方式,结果都是解析树数据结构。
为了区分/简化,可以编写相当简单的递归函数。
(如果你需要的只是答案,我是Maxima的忠实粉丝。)
否则你可以写下这些东西:
简化:这将输入一个解析树作为输入,并通过应用如下规则生成一个新的:
- 任何时候0都是零
- 任何时候1都是那件事
- 任何加0的东西都是那个东西
- 任何其他数值加/减任何其他只是一个新的数值
- 任何数值时间/除以任何其他值只是一个新的数值
替换:这需要一个解析树A,一个像“n”的标记名,另一个树B,走树A,以及出现“n”的地方,用B的副本替换它。 结果是A的所有“n”的副本被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从70年代早期开始在麻省理工学院人工智能实验室开始使用Macsyma(MAC Symbolic Manipulation),基于MacLisp并从Joel Moses的符号整合计划开始。 它可以做代数,微分和积分微积分,矩阵和张量数学,微分方程,等等,等等。