用于查找给定数学表达式的所有可能答案的算法

时间:2016-04-24 08:39:28

标签: algorithm

这个问题现在已经有几天了,我想知道什么是解决这个问题的最简单和最好的方法。决定与SO社区讨论。

问题状态,我们有一个字符串,其中包含一些数字和一些操作(有效操作只有+, - 和*),现在通过以下方式找到此数学表达式的所有可能答案在所有可能的地方放置大括号

例如,如果输入字符串是" 1 + 2-3 * 4"
答案可以是

(((1 + 2)-3)* 4)= 0
(((1 + 2) - (3 * 4))= - 9
(1 +((2-3)* 4)= -3
(1+(2-(3 * 4)))= - 9
((1+(2-3))* 4)= 0

像这样,(我可能会遗漏一些案例或计算错误,但你明白了:D ),而假设我们总是在字符串中有效输入,只有1最初的数字,我们必须打印所有可能的答案组合,这可能是最简单和/或最好的算法。

PS:我不知道这个社区是否适合这样的问题,但我看到很多这样的问题,所以我发布了这个,如果这不是正确的社区这些问题,请指导我哪一个。三江源。

2 个答案:

答案 0 :(得分:2)

所以这看起来像一个简单的递归问题,而你的递归步骤应该是(我将把编码留给你):

“在这里打开一对括号并继续”

并且,如果适用(您背后有开放式括号):

“在这里关闭一对括号并继续”

包装 - 确保在编写代码时考虑到表达式的合法性:

  1. 您的递归步骤在每次操作后执行,而不是在数字后执行。
  2. 您打开时会关闭相同数量的括号。
  3. 如果不合法,您不会关闭一对括号(打开的括号数> =每一步的闭合括号数)。
  4. 当您到达表达式的末尾时,计算并打印出一个值。

    修改

    代码会是这样的(在运行中编写它,没有考虑到极端情况等等,但只是足以让你得到一般的想法):

    public void Solve(string expression,int positions, int currentPosition, int numberOfOpened ,int[] brackets){ if (currentPosition == positions){ // We are done, this method can be implemented by using a stack and // various solutions can be found across StackOverflow. PrintSolution(expression,brackets); return; } // Close and continue recursion if (numberOfOpened > 0){ int[] newBrackets = CloneAndAddClosingBracket(brackets); Solve(expression,positions,currentPosition++,numberOfOpened-1,newBrackets); } // Open and continue recursion int[] newBrackets = CloneAndAddOpeningBracket(brackets); Solve(expression,positions,currentPosition++,numberOfOpened+1,newBrackets); }

答案 1 :(得分:1)

嗯,括号只是优先考虑函数,所以我会在解析时创建所有可能的函数树:

((1 + 2)x3):-------------------------(1+(2x3)):

           x                        +
          / \                      / \
         +   3                    1   x
        / \                          / \
       1   2                        2   3

用于打印结果,只需在树中的每个函数周围放置括号