Я бы предположил, что вид сокращений, который они ищут, заключается в том, что что-то вроде (2 + 3) * x
должно стать (* 5 x)
, а не (* (+ 2 3) x)
.В этом случае вы можете просто распознать, что поддеревья являются постоянными, и рассчитать их.
Вы также можете использовать ассоциативные и коммутативные законы, чтобы сначала попытаться изменить положение вещей, чтобы помочь процессу.Так что 2 + x + 3
станет (+ 5 x)
, а не (+ (+ 2 x) 3)
.
Возьмите эту идею так далеко, как вы хотите.Это было преднамеренно дано открытым способом.Я уверен, что они будут рады видеть, что вы автоматически узнаете, что x * x + 2 * x + 1
- это (* (+ 1 x) (+ 1 x))
вместо (+ (+ (* x x) (* 2 x)) 1)
, но вы можете сделать много хороших сокращений, не переходя туда.