如何使用递归最大化和最小化数学表达式?
How do I maximise and minimize the mathematical expression using recursion?
表达式由数字 (0-9) 组成,由两个运算符“*
”和“+
”之一分隔。字符之间没有空格。
示例:1+2*3+4*5
我们需要在适当的地方用括号找出最大和最小值。
最大值:105 = (1+2)*(3+4)*5
最小值:27 = 1+2*3+4*5
我正在寻找一种递归的方法吗?任何想法将不胜感激。
最小化:
解题思路:与其考虑怎么加括号,不如想想最后一个操作是哪个。让我们写一个递归函数minimize(expr)
。它应该做什么?如果给它一个数字,它应该只是 return 它。否则,我们可以遍历其中的所有运算符,为运算符左右的部分表达式调用 minimize
并合并结果。现在我们只需要选择最小的值。
这是一些伪代码:
int minimize(string expr)
if isNumber(expr) then // If it is one number, return it.
return value(expr)
int res = infinity
for int i <- 0 .. lenght expr - 1
if expr[i] == '+' then
res = min(res, minimize(expr[0 .. i - 1]) +
minimize(expr[i + 1 .. length expr - 1])
if expr[i] == '*' then
res = min(res, minimize(expr[0 .. i - 1]) *
minimize(expr[i + 1 .. length expr - 1])
return res
最大化:
几乎相同,但我们应该在每一步取最大值而不是最小值。
为什么是正确的?当我们对非负数进行乘法和加法时,操作数越大(越小),结果就越大(越小)。
我们也可以使用记忆来避免对同一个表达式重新计算两次(或更多次)的结果并获得多项式时间复杂度。
表达式由数字 (0-9) 组成,由两个运算符“*
”和“+
”之一分隔。字符之间没有空格。
示例:1+2*3+4*5
我们需要在适当的地方用括号找出最大和最小值。
最大值:105 = (1+2)*(3+4)*5
最小值:27 = 1+2*3+4*5
我正在寻找一种递归的方法吗?任何想法将不胜感激。
最小化:
解题思路:与其考虑怎么加括号,不如想想最后一个操作是哪个。让我们写一个递归函数minimize(expr)
。它应该做什么?如果给它一个数字,它应该只是 return 它。否则,我们可以遍历其中的所有运算符,为运算符左右的部分表达式调用 minimize
并合并结果。现在我们只需要选择最小的值。
这是一些伪代码:
int minimize(string expr)
if isNumber(expr) then // If it is one number, return it.
return value(expr)
int res = infinity
for int i <- 0 .. lenght expr - 1
if expr[i] == '+' then
res = min(res, minimize(expr[0 .. i - 1]) +
minimize(expr[i + 1 .. length expr - 1])
if expr[i] == '*' then
res = min(res, minimize(expr[0 .. i - 1]) *
minimize(expr[i + 1 .. length expr - 1])
return res
最大化:
几乎相同,但我们应该在每一步取最大值而不是最小值。
为什么是正确的?当我们对非负数进行乘法和加法时,操作数越大(越小),结果就越大(越小)。
我们也可以使用记忆来避免对同一个表达式重新计算两次(或更多次)的结果并获得多项式时间复杂度。