В основном вы начинаете с корня исходного дерева и идете вниз, вычисляя производные для узлов, когда это становится необходимым. Например, поскольку 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
всегда возвращает один и тот же объект? Его название предполагает, что он делает новую копию каждый раз.