如何在python中使用一组相同的值执行所有有效计算?

时间:2014-01-26 20:21:06

标签: python math iteration

我需要用4个相同的整数进行所有计算。例如。

def all_math(number,goal):
     "not sure what to put here yet"

>>print(all_math(3, 6)
3+3+3+3
3+3+3-3#<<Should return this
3+3-3-3
3-3-3-3
((3/3)+3)-3
3*3*3*3

等等。

如何迭代所有这些计算,直到达到给定值(参数goal)?

2 个答案:

答案 0 :(得分:2)

只有两种根本不同的方法来构建具有四个初始值的表达式。您可以将两个值组合成两对,然后组合结果(总共三个操作),或者您可以组合两个,然后结果与第三个,然后结果与最后一个(也是三个操作)。根据您是将每个新的“原始”值放在左侧还是右侧,后者有子案例:((3/3)/3)/33/(3/(3/3))3/((3/3)/3)或{不同{1}}。

然后你必须定义哪些二进制操作是相关的。你已经列出了加法,减法,乘法,除法。还有什么?幂?另一种除法(整数与浮点数)?模? (3/(3/3))/3

这是足以完全产生所有可能性的信息(好吧,如果你可以做相关的组合学)。每个模式在运算符中只有三个位置,因此有math.atan2种可能性5 * N**3是运算符的数量。我怀疑这是一个愚蠢的数字。

但是,您需要确定“等效”的结果对是否应同时包含在结果中。例如,您要单独列出N(3 + 3) * (3 - 3)吗?那么(3 - 3) * (3 + 3)((3 + 3) + 3) + 3)怎么样?那么(3 + 3) + (3 + 3)3+3+3-3怎么样?如果有必要,在此基础上修剪输出可能非常困难,这取决于您认为等效的内容,并且在问题中没有定义。

您还需要决定是否包含无法评估的表达式,例如3-3+3+3。识别这些并不困难 - 如果所有其他方法都失败了,只需评估表达式并捕获异常。

最后,根据您所包含的操作的关联性规则,您需要决定是否必须从输出中删除不必要的括号。您的示例输出(3 - 3) / (3 - 3)表示您愿意,但3+3+3+3建议您不要。

答案 1 :(得分:0)

这个人应该这样做。如果我忘了一个选项,添加它应该不难:

import itertools

def all_math(n, goal):
    operators = ["+" , "-", "*", "/"]
    brackets = ["{0}{1}{0}{2}{0}{3}{0}",
                "({0}{1}{0}){2}{0}{3}{0}",
                "{0}{1}{0}{2}({0}{3}{0})",
                "({0}{1}{0}){2}({0}{3}{0})",
                "({0}{1}{0}{2}{0}){3}{0}",
                "({0}{1}({0}{2}{0})){3}{0}",
                "(({0}{1}{0}){2}{0}){3}{0}",
                "{0}{1}({0}{2}{0}{3}{0})",
                "{0}{1}({0}{2}({0}{3}{0}))",
                "{0}{1}(({0}{2}{0}){3}{0})",
                ]
    for combination in itertools.product(operators, repeat=3):
        for bracket in brackets:
            formula = bracket.format(n, *combination)
            try:
                result = eval(formula)
                print formula + " = " + str(result) #for verification
                if result == goal:
                    return bracket.format(int(n), *combination) #to output integer
            except ZeroDivisionError:
                print formula + " = Zero Division Error"

print "Result:", all_math(3.0, 6)

如果有人对括号有一个很好的算法,我想阅读它。我的版本有点手工制作......

重要提示:使用浮动作为参数(3.0,而不是3),否则您遇到了麻烦......