使用循环的公式生成器

2024-06-16 09:41:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写一个程序,迭代所有可能的简单方程,找到一个值24。我设法完成了这个循环,但有些东西我没有抓住。在

这个想法是有一个3级循环(我猜是θ(n^3)?,im bad with time complexity),这是用来建立一个方程,其中有4个数字(在程序早期随机生成)被添加到我的列表中。在

numList = [x2, x3, x4]

下面是我的代码:

^{pr2}$

当由于某种原因,我正在构建和计算的字符串(x)没有重置,而是添加到上一个循环迭代中生成的同一个字符串(它应该是默认值)时,就会出现错误。默认值x随机生成:

x = str(randrange(1, 9))

这对我来说很奇怪,我不确定出了什么问题,循环就像一个没有中断的switch条件语句。以下是我的控制台输出:Pasted to pastebin

有人能告诉我我做错了什么吗?或者代码中发生了什么我看不到的东西 为什么x不被重置,好像它是一个新的字符串正在构建(这是我想要的)?在

编辑:以下是全部来源:equation.py


Tags: 字符串代码程序列表timewith数字重置
2条回答

下面是另一种不依赖eval的表达式生成器的方法,它还允许您轻松地使用任何二进制(2个参数)函数和任何顺序的操作:

class Operation():
    def __init__(self, func, precedence):
        self.func = func
        self.precedence = precedence
    def __call__(self, *args):
        return self.func(*args)
    def __repr__(self):
        return self.func.__name__

class Equation():
    def __init__(self, numbers, operations):
        self.nums = list(numbers)
        self.ops = list(operations)
    def eval(self):
        while self.ops:
            min_op_precedence = min([x.precedence for x in self.ops])
            #get all pairs of numbers in the list [1,2,3] -> [(1,2), (2,3)]
            for index, pair in enumerate(zip(self.nums, self.nums[1:])):
                if self.ops[index].precedence == min_op_precedence:
                    #evaluate pair of numbers if the precedence for their op is highest
                    #ie "1 * 2 - 3" -> "2 - 3"
                    val = self.ops[index](*pair) 
                    self.nums.pop(index) 
                    self.nums[index] = val 
                    self.ops.pop(index)
                    break
        return self.nums.pop()

如果存在这样的排列(使用蛮力),您可以使用它来找出操作的排列会产生某种结果:

^{pr2}$

问题不是“x没有被重置”。问题是,您的代码并没有被设计为在每次传递中都使用三个运算符。因为,如果1是1的话,那么对于1,这个等式是重复的。在

您需要更像这样的逻辑,即显式地使用三个运算符并迭代三个运算符的所有组合:

from random import randrange

def brute_force():
    x1 = randrange(1, 9)
    x2 = randrange(1, 9)
    x3 = randrange(1, 9)
    x4 = randrange(1, 9)
    numList = [x1, x2, x3, x4]
    operatorList = ["+", "-", "/", "*"]
    equation = ""

    for i in range(4):
        for j in range(4):
            for k in range(4):
                equation = str(numList[0]) + operatorList[i] + str(numList[1]) + operatorList[j] + str(numList[2]) + operatorList[k] + str(numList[3])
                print("equation: " + equation)
                print("evaluation: " + str(eval(equation)))

if __name__ == "__main__":
    brute_force()

输出看起来像

^{pr2}$

相关问题 更多 >