<p>实际上,只要Ray Toal的响应是形式上正确的,对于这样一个简单的问题,您不必对每个运算符*进行子类化。我想出了以下代码,它运行得很好:</p>
<pre><code>import random
import math
class Expression(object):
OPS = ['+', '-', '*', '/']
GROUP_PROB = 0.3
MIN_NUM, MAX_NUM = 0, 20
def __init__(self, maxNumbers, _maxdepth=None, _depth=0):
"""
maxNumbers has to be a power of 2
"""
if _maxdepth is None:
_maxdepth = math.log(maxNumbers, 2) - 1
if _depth < _maxdepth and random.randint(0, _maxdepth) > _depth:
self.left = Expression(maxNumbers, _maxdepth, _depth + 1)
else:
self.left = random.randint(Expression.MIN_NUM, Expression.MAX_NUM)
if _depth < _maxdepth and random.randint(0, _maxdepth) > _depth:
self.right = Expression(maxNumbers, _maxdepth, _depth + 1)
else:
self.right = random.randint(Expression.MIN_NUM, Expression.MAX_NUM)
self.grouped = random.random() < Expression.GROUP_PROB
self.operator = random.choice(Expression.OPS)
def __str__(self):
s = '{0!s} {1} {2!s}'.format(self.left, self.operator, self.right)
if self.grouped:
return '({0})'.format(s)
else:
return s
for i in range(10):
print Expression(4)
</code></pre>
<p>尽管可以改进它来考虑诸如按零除(目前还没有处理)、通过属性定制所有参数、允许<code>maxNumbers</code>参数的任何值等等。在</p>
<p>*我所说的“简单问题”是指“生成有效表达式”;如果您添加了任何其他功能(例如,表达式求值),那么Ray的方法将付出代价,因为您可以以更干净的方式定义每个子类的行为。在</p>
<p>编辑(输出):</p>
^{pr2}$