Я имею следующую рекурсивную функцию, чтобы сгенерировать список допустимых конфигураций для (имени) список позиций, где каждая позиция может быть использована только один раз:Как преобразовать рекурсивную функцию в генератор?
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)
Кроме того, можно есть нет действительных комбинаций, например. для 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
, но это не приносит никаких результатов вообще. Что я делаю не так?
Почему downvote? – FriendFX