|
发表于 2024-3-28 16:07:20
|
显示全部楼层
非常抱歉,我之前提供的代码确实存在问题导致递归深度过大而无法正常运行。让我们改进一下生成表达式的方法,以避免递归深度问题,并确保生成的表达式是合法的。
我们可以通过迭代的方式生成表达式,使用栈来存储操作符和括号的信息。首先,我们定义一个操作符列表和括号列表,然后从左到右遍历每个位置,随机生成一个元素(数字、操作符或括号)。按照以下规则进行选择:
1. 如果当前位置是数字,则直接添加数字到表达式字符串中。
2. 如果当前位置是操作符,则判断栈是否为空。如果栈为空,则直接将操作符添加到表达式字符串中;如果栈不为空,则比较当前操作符与栈顶操作符的优先级,如果当前操作符的优先级大于等于栈顶操作符的优先级,则将栈顶操作符出栈,并将出栈的操作符添加到表达式字符串中,再将当前操作符入栈;如果当前操作符的优先级小于栈顶操作符的优先级,则直接将当前操作符入栈。
3. 如果当前位置是左括号,则直接将左括号入栈。
4. 如果当前位置是右括号,则先将栈顶的操作符出栈并添加到表达式字符串中,直到遇到左括号。然后将左括号出栈。
最终,我们得到的字符串即为一个随机且合法的表达式。
下面是改进后的代码示例:
- import random
- def generate_expression(length):
- operators = ['+', '-', '*', '/']
- brackets = ['(', ')']
-
- stack = []
- expression = ''
- for _ in range(length):
- choice = random.randint(1, 3)
- if choice == 1: # 数字
- digit = random.randint(0, 9)
- expression += str(digit)
- elif choice == 2: # 运算符
- if not stack or stack[-1] == '(':
- operator = random.choice(operators)
- stack.append(operator)
- else:
- while stack and stack[-1] != '(' and operators.index(stack[-1]) <= operators.index('+'):
- expression += stack.pop()
- operator = random.choice(operators)
- stack.append(operator)
- else: # 括号
- bracket = random.choice(brackets)
-
- if bracket == '(':
- stack.append(bracket)
- else:
- while stack and stack[-1] != '(':
- expression += stack.pop()
- stack.pop() # 弹出左括号
- while stack:
- expression += stack.pop()
- return expression
- expression = generate_expression(10)
- print(expression)
复制代码
请注意,这只是一个简化的示例代码,实际生成表达式的方法还需要更复杂的逻辑和规则,以确保生成的表达式满足预期的要求。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|