【发布时间】:2015-11-10 02:47:11
【问题描述】:
我有以下递归函数来为(命名的)位置列表生成有效配置列表,其中每个位置只能使用一次:
def generate_configurations(configurations, named_positions, current):
if len(current) == len(named_positions):
configurations.append(current)
return configurations
name, positions = named_positions[len(current)]
for x in positions:
if x not in current:
generate_configurations(configurations, named_positions, current + (x,))
return configurations
这是我如何称呼它的一个例子:
named_positions = [('a', [0,1,2]),
('b', [1,3]),
('c', [1,2])]
for comb in generate_configurations([], named_positions, ()):
print comb
它给出以下输出:
(0, 1, 2)
(0, 3, 1)
(0, 3, 2)
(1, 3, 2)
(2, 3, 1)
另外,可能有 no 个有效组合,例如为named_positions = [('a', [3]), ('b', [3])]。
现在,根据输入 named_positions,configurations 列表会很快变得巨大,从而产生 MemoryError。我相信这个函数可以重写为生成器,所以我尝试了以下方法:
def generate_configurations(named_positions, current):
if len(current) == len(named_positions):
yield current
name, positions = named_positions[len(current)]
for x in positions:
if x not in current:
generate_configurations(named_positions, current + (x,))
named_positions = [('a', [0,1,2]),
('b', [1,3]),
('c', [1,2])]
for comb in generate_configurations(named_positions, ()):
print comb
但这根本不会产生任何结果。我做错了什么?
【问题讨论】:
标签: python python-2.7 recursion generator