递归生成器函数“得自”

时间:2018-09-20 19:27:32

标签: python python-3.x recursion generator

我试图按顺序生成列表的排列,但未列举所有可能的排列。我的算法是递归的,每个子调用都传递一个不可变的“ 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很容易实现,但是我想使用自定义生成器来实现。

我之前发现的最相似的问题是here,我猜是here。我有什么误解/做错了什么?

0 个答案:

没有答案