Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 找到给定数学表达式所有可能答案的算法_Algorithm - Fatal编程技术网

Algorithm 找到给定数学表达式所有可能答案的算法

Algorithm 找到给定数学表达式所有可能答案的算法,algorithm,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 像这样,(我可能遗漏了一些案例或计算错误

这个问题已经困扰了我好几天了,我想知道什么是解决这个问题的最简单和最好的方法。决定与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:我不知道这个社区是否适合这些问题,但我看到很多类似的问题,所以我发布了这个,如果这不是适合这些问题的社区,请告诉我哪一个是。谢谢。

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

“在此处打开一对括号,然后继续”

此外,如果适用(后面有开放式括号):

“在此处关闭一对括号,然后继续”

总结—在编写代码时,请确保考虑到表达式的合法性:

  • 递归步骤是在每次操作之后执行的,而不是在数字之后
  • 关闭的括号数量与打开的括号数量相同
  • 如果一对括号不合法,则不关闭(每一步打开的括号数>=关闭的括号数)
  • 到达表达式末尾时,计算并打印一个值

    编辑:

    Pseudo代码类似于(动态编写,没有考虑角落案例等,但只足以让您了解总体思路):

    public void Solve(字符串表达式、int positions、int currentPosition、int numberOfOpened、int[]方括号){
    如果(当前位置==位置){
    //我们完成了,这个方法可以通过使用堆栈和
    //可以在StackOverflow中找到各种解决方案。
    打印解决方案(表达式、括号);
    返回;
    }
    //关闭并继续递归
    如果(打开的编号>0){
    int[]新支架=克隆和克隆支架(支架);
    求解(表达式、位置、currentPosition++、numberOfOpened-1、新球拍);
    }
    //打开并继续递归
    int[]新支架=克隆和开放支架(支架);
    求解(表达式、位置、currentPosition++、NumberOfOpen+1、新球拍);
    }
    

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

    “在此处打开一对括号,然后继续”

    此外,如果适用(后面有开放式括号):

    “在此处关闭一对括号,然后继续”

    总结—在编写代码时,请确保考虑到表达式的合法性:

  • 递归步骤是在每次操作之后执行的,而不是在数字之后
  • 关闭的括号数量与打开的括号数量相同
  • 如果一对括号不合法,则不关闭(每一步打开的括号数>=关闭的括号数)
  • 到达表达式末尾时,计算并打印一个值

    编辑:

    Pseudo代码类似于(动态编写,没有考虑角落案例等,但只足以让您了解总体思路):

    public void Solve(字符串表达式、int positions、int currentPosition、int numberOfOpened、int[]方括号){
    如果(当前位置==位置){
    //我们完成了,这个方法可以通过使用堆栈和
    //可以在StackOverflow中找到各种解决方案。
    打印解决方案(表达式、括号);
    返回;
    }
    //关闭并继续递归
    如果(打开的编号>0){
    int[]新支架=克隆和克隆支架(支架);
    求解(表达式、位置、currentPosition++、numberOfOpened-1、新球拍);
    }
    //打开并继续递归
    int[]新支架=克隆和开放支架(支架);
    求解(表达式、位置、currentPosition++、NumberOfOpen+1、新球拍);
    }
    

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

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


    为了打印结果,只需在树中的每个函数周围放上括号

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

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


    要打印结果,只需在树中的每个函数周围放上括号即可

    您可以将数字和运算放在两个单独的列表中。然后迭代运算符列表,并为每个元素构建所有可能的树,将该元素作为根。您可以将数字和运算放在两个单独的列表中。然后迭代o如果可能的话,你能详细说明一下,最好是伪代码之类的吗?在代码中添加了一般的想法,注意,如果你需要返回所有的解决方案,你仍然需要计算PrtPosits中的表达式。参数a的离子
               x                        +
              / \                      / \
             +   3                    1   x
            / \                          / \
           1   2                        2   3