在Haskell中找到四个10的所有表达式

时间:2018-10-19 00:56:29

标签: haskell

遇到了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中解决的问题。

1 个答案:

答案 0 :(得分:0)

反向波兰符号是解决此问题的可行方法。您可以在以下准RPN中的两个10之间插入算术(+-*/)运算符:

10 10 10 10

生成可能的RPN后,将其转换为中缀表示法。例如,10 10 + 10 10 + /被转换为(10+10)/(10+10)

但是,并非所有排列都是合法的。例如,以下RPN是非法的:

10 + 10 - 10 * 10 /

您必须确保每个运算符都有足够的操作数。在上面的示例中,第一个+只有一个10作为其操作数,因此是非法的。

您可以简单地将所有合法运营商的放置规则硬编码到代码中。