我在实现给出类似这样的函数时遇到了麻烦:
'((+(d + e) + f) + (a + (a + c))
返回:
'(d + (e + (f + (a + (a + c)))))
现在问题是我必须使用关联性来获得答案,所以我只想使用这个属性:
'((a + b) + c) = '(a + (b + c))
获得正确的输出。我知道如何实现这种情况的功能:
'((a + b) + c) -> '(a + (b + c))
但是我似乎无法弄清楚如何在上面的第一个案例(或任何其他大于三个案例的案例)中实施它。我不是只寻求一些指导的答案。如果你想看到代码片段让我知道,我可以发布一些。另外,我创建了一个从列表中去掉“+”以使其更容易处理的函数。
我认为这定义了语法:
var ::= a | b | c | d | e | f | g
fpip ::= var | (fpip + fpip)
有效的fpip可以是:
fpip = '((a + b) + c)
或
fpip = '((a + b) + (c + d))
并且处于最原子级别:
fpip = '(a + b)
编辑:是的,初始的'+应该被删除。无论初始输入中有多少加号,输出中应该只有(量的 - 1)'+。例如:
'(+ + + + (a + b) + + c) -> '(a + (b + c)
答案 0 :(得分:1)
我认为这些是需要考虑的案例。让我们调用递归重写器REWRITE。
var -> var
(var + var) -> (var + var)
(var + (fip1 + fpip2)) -> (var + (REWRITE (fip1 + fpip2))
((fip1 + fpip2) + var) -> (REWRITE (fip1 + (fip2 + var))
((fip1 + fpip2) + (fip3 + fpip4)) -> (REWRITE (fip1 + (fip2 + (fip3 + fip4))))