确定表达式中哪些变量不是确定答案所必需的算法

时间:2017-10-29 03:03:17

标签: algorithm logic boolean-logic algebra

我正在开发一个遍历决策树的项目。决策树中的每个节点都有一个公式,该公式可以包含多个变量并且相当复杂。应用程序要求用户逐个输入变量的值。

该应用程序的两个要求是:

  1. 应用程序必须要求用户按照它们在表达式中出现的顺序来回答变量。
  2. 应用程序必须跳过任何不需要的变量来确定答案。
  3. 如果陈述的格式为:

    if(expression;pass;fail)
    

    例如,请考虑以下表达式:

    if((a=1&b=1)|(c=1&d=1&e=1)|f=1;1;2)
    

    如果我们已经知道a = 1且b = 1,那么无论c,d,e和f的值如何,我们都知道答案为1。因此,无需要求用户输入这些变量的值。

    这些表达式可能相当复杂,包含多个比较运算符和嵌入式ifs。例如:

    if(a>1;if(b<5;1;if(c=2;2;0));if(d!=2;if(e=1;1;if(f=2;2;0));0))
    

    我有一个糟糕的时间想出一个算法来有效地做到这一点。是否存在用于确定给定表达式中哪些变量无关紧要的现有算法?或者也许只是一种思考问题的新方法,可能会帮助我在这里?

1 个答案:

答案 0 :(得分:0)

如何构建语法树?

enter image description here

如您所见,字面数字被视为已解决。每次用户为变量赋值时,相应的叶节点都会解析为该值。然后,您遍历树解析值,直到不再能够解析节点。如果到达根节点,则可以确定答案。

enter image description here

编辑:if(e1;e2;e3)表达式可以表示为三元运算符节点(具有三个子节点)。如果e1已解析为truee2已解析为某个值v,则此表达式将解析为v。案例e1=false也是如此。