遇到了CS问题。
问题在于递归地查找((10 + 10)/(10 + 10))形式的哪个表达式产生数字。例如,(((10 + 10)/(10 + 10))产生1。使用+,-,*,/的运算符查找所有其他表达式,并使用4的数字10,并使用所有括号的组合来强制执行顺序操作。
我被称为“反向波兰语符号”,但这依赖于后缀符号,解决该问题并非必需。
我有一些伪代码是这个。我知道使用递归是解决此问题的最简单方法。但是不知道如何确保我得到所有组合。
build([10,10,10,10], Expression) :-
Operator
/ \
[10] [10,10,10]
Operator
/ \
[10] [10,10]
Operator
/ \
[10] [10]
这是我要在Haskell中解决的问题。
答案 0 :(得分:0)
反向波兰符号是解决此问题的可行方法。您可以在以下准RPN中的两个10之间插入算术(+
,-
,*
,/
)运算符:
10 10 10 10
生成可能的RPN后,将其转换为中缀表示法。例如,10 10 + 10 10 + /
被转换为(10+10)/(10+10)
。
但是,并非所有排列都是合法的。例如,以下RPN是非法的:
10 + 10 - 10 * 10 /
您必须确保每个运算符都有足够的操作数。在上面的示例中,第一个+
只有一个10作为其操作数,因此是非法的。
您可以简单地将所有合法运营商的放置规则硬编码到代码中。