考虑3个数字,如(2,3,4),这些数字根据树的深度不同。因此,深度为3的树将生成:
2 2 2
2 2 3
2 2 4
2 3 2
2 3 3
2 3 4
2 4 2
2 4 3
2 4 4
3 2 2
3 2 3
3 2 4
3 3 2
3 3 3
3 3 4
3 4 2
3 4 3
3 4 4
4 2 2
4 2 3
4 2 4
4 3 2
4 3 3
4 3 4
4 4 2
4 4 3
4 4 4
本质上它是笛卡尔积。我发现了多种生成这些树的方法,例如,这两种:
size = [2, 3, 4]
depth = 3
pos = [size] * depth
#method 1
for element in itertools.product(*pos):
print element
#method 2
def product(*args):
if not args:
return iter(((),)) # yield tuple()
return (items + (item,)
for items in product(*args[:-1]) for item in args[-1])
print list(product(*pos))
但是他们不允许我在创建元组时进行计算。
想象一下,你想过滤所有导致7的结果(不仅是最终结果)。例如,2 2 2总共6个,所以你去下一个2 2 3这个给7个。现在你可以跳过一个(你肯定知道下一个结果不会给出7)。这个跳过部分对我来说很重要,因为它可以节省大量的计算时间。
另一个例子是以4 3开头的分支,它需要在那里停止,因为它已经是7.因此不对子分支进行计算。
如何在创建元组期间执行计算,并根据计算决定跳过肯定会超过7的分支。