关于迭代构建生成器的问题

问题描述 投票:0回答:1

我在 CS61A 中遇到了问题

给定一个唯一元素的序列,该序列的排列是一个以某种任意顺序包含序列元素的列表。例如,

[2, 1, 3]
[1, 3, 2]
[3, 2, 1]
是序列
1, 2, 3]
的一些排列。
实现
gen_perms
,一个生成器函数,它接受序列
seq
并返回一个生成
seq
的所有排列的生成器。对于这个问题,假设 seq 不会为空。排列可以按任何顺序产生。

我的解决方案是:

def gen_perms(seq):
   def generator(seq_):
        list_seq=list(seq_)
        if len(list_seq)==1:
            yield list_seq
        else:
            for item in generator(list_seq[1:]):
                for i in range(len(list_seq)):
                    yield item[:i]+[list_seq[0]]+item[i:]
return generator(seq)

一个实例是

print(list(gene_perms([10,20,30])))

输出效果很好:
[[10, 20, 30], [20, 10, 30], [20, 30, 10], [10, 30, 20], [30, 10, 20], [30, 20, 10]]

我的疑问是,它看起来不应该有正确的输出,因为在我的代码中

generator
是递归构建的,并且
yield
generator(list_seq[1:])
行出现在
generator(list_seq)
之前,并且它应该产生首先对其子序列进行排列,然后对序列本身进行排列。但前一种情况甚至没有出现在输出中。
有人可以向我解释一下吗?也许我对生成器的工作原理有错误的理解。谢谢!

python iteration generator
1个回答
0
投票

尽管更深层次的递归调用的

yield
发生得更早,但这些产生的值会被进行更深层次递归调用的 for 循环所消耗
。这些产生的值不会神奇地冒出整个递归树!它们由直接调用者使用,而不是由递归堆栈更高层的任何调用者使用。

每个生成器执行(唯一)负责向其直接消费者产生值。递归中更深层次的调用不会产生顶级调用者将看到的值。

© www.soinside.com 2019 - 2024. All rights reserved.