给出一个前缀表达式,其中包含潜在变量,并且每个变量都可以取值范围,在为变量分配适当的值后找到表达式的最大值
例如
+ 1 x
{ x: [3 7) }
这里x可以取值3到7(不包括)(范围始终为[x, y)
)和0 < x,y <= max_int
起初,我认为这很简单,并且对于每个受支持的(+ - * /)
运算符,我使用以下逻辑决定了在替换时需要选择的范围内的值
例如 当运算符为+并且其操作数为范围时,则从该范围中选择最大值 当运算符为-并且其操作数为范围时,则选择最小值 当运算符为*并且其操作数为范围时,则选择最大值 当operator为/且其numerand为范围时,则选择最大值;如果分母为范围,则选择最小值(这是/最大化的方式)
我使用了基于常规堆栈的方法来评估前缀表达式
我通过反转前缀转换了前缀=>后缀,对吗? [+, 1, 2] becomes [2, 1, +]
,是否在所有情况下都是prefix == reverse(postfix)
?
这是我的实现方式
def add(a, b):
x = max(a) if isinstance(a, tuple) else a
y = max(b) if isinstance(b, tuple) else b
return x + y
def sub(a, b):
x = min(a) if isinstance(a, tuple) else a
y = min(b) if isinstance(b, tuple) else b
return x - y
def mul(a, b):
x = max(a) if isinstance(a, tuple) else a
y = max(b) if isinstance(b, tuple) else b
return x * y
def divide(a, b):
x = max(a) if isinstance(a, tuple) else a
y = min(b) if isinstance(b, tuple) else b
return int(x / y)
ops = {
"+": add,
"-": sub,
"*": mul,
"/": divide
}
def max_result_expression(expression, variables):
stack = []
tokens = expression.split()[::-1] ;; is this correct logically?
for token in tokens:
print(stack)
if token in ops:
i = stack.pop()
j = stack.pop()
res = ops[token](i, j)
stack.append(res)
else:
if token in variables:
r = variables[token]
stack.append((r[0], r[1] - 1))
else:
stack.append(int(token))
return stack.pop()
print(max_result_expression("/ 10 + 1 x", {"x": (1, 5)}))
对于上面给出的表达式,如果x被选为1,但根据我的上述逻辑选择为5,则最大值可能为5,这是失败的。我知道我的最小,最大方法的问题在于,它会考虑使用当前的运算符来进行本地决策。在这种情况下,由于除法是顶级运算符,因此+
必须将其结果减到最小
我现在不知道如何进行此操作。我猜想为此需要使用一些递归解决方案
编辑:
让我们假设变量没有被重用,即它们只出现一次
变量的范围是0 < i <= max_int
表达式中的变量数为10^3