我试图按顺序生成列表的排列,但未列举所有可能的排列。我的算法是递归的,每个子调用都传递一个不可变的“ head”,子调用按顺序排列“ tail”。
我对“产生自”的理解是,一旦内部生成器用完了它生成的元素,外部生成器就会继续其代码路径。不过,我感到困惑,因为生成器仅生成第一个排列,然后在下次调用StopIteration
时引发next
异常。
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
def permutations(head, tail):
if tail == []:
yield head
else:
for num in tail:
new_head = head + [num]
new_tail = tail
new_tail.remove(num)
yield from permutations(new_head, new_tail)
perm_generator = permutations([], nums)
for i in range(1000000):
res = next(perm_generator)
print(res)
输出为:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Traceback (most recent call last):
File "024.py", line 19, in <module>
res = next(perm_generator)
StopIteration
我知道itertools
很容易实现,但是我想使用自定义生成器来实现。