衍生表达式树java

时间:2012-03-16 23:47:30

标签: java tree derivative

我正在尝试实现一个返回表示表达式派生的新树的方法。我有原始表达树,以及我可以使用的精确副本。我知道我可以递归地使用区分规则和基本情况来确定节点是常数还是数字。但是我无法解决如何存储新表达式的问题。

我不需要一个确切的答案,只是关于如何存储新表达式的一些指导/建议?

图表很有帮助,谢谢!我到了那里,但仍然无法实现工作代码。

  if(this.getValue().equals("mult")){
        this.deepCopy().setValue("add");
        this.deepCopy().getRightChild().setValue("mult");
        this.deepCopy().getLeftChild().setValue("mult");
        // not sure what to recursively here!

        }

2 个答案:

答案 0 :(得分:0)

显而易见的答案是使用专为符号操作公式而设计的语言。提示:它始于1960年之前,它是四个字母。

嘿,看看这个,看来这个领域有一些新技术:http://www.autodiff.org/

http://www.cs.berkeley.edu/~fateman/papers/ADIL.pdf

答案 1 :(得分:0)

基本上,您从原始树的根开始,向下工作,在必要时计算节点的导数。例如,由于D fg = f'g + fg',对于乘法节点,您将输出一个乘积之和:

           ....                   ....
             \                      \
              *                      +
             / \           ->       / \
            F   G                  *   *
                                  / \ / \
                                 F' G F G'

从哪里得到F'和G'?这就是递归的起点。

更新:原则上你不是那么遥远,你只需填写乘法的子树:

Node right = this.deepCopy().getRightChild();
Node left = this.deepCopy().getLeftChild();
right.setLeftChild(derivative(this.getLeftChild()))   // F'
right.setRightChild(this.getRightChild()))            // G
left.setLeftChild(this.getLeftChild())                // F
left.setRightChild(derivative(this.getRightChild()))) // G'

虽然我必须说API看起来有点奇怪。 deepCopy总是返回相同的对象吗?它的名字会建议它每次都会制作一个新的副本。