我在 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)
之前,并且它应该产生首先对其子序列进行排列,然后对序列本身进行排列。但前一种情况甚至没有出现在输出中。尽管更深层次的递归调用的
yield
发生得更早,但这些产生的值会被进行更深层次递归调用的 for
循环所消耗。这些产生的值不会神奇地冒出整个递归树!它们由直接调用者使用,而不是由递归堆栈更高层的任何调用者使用。每个生成器执行(唯一)负责向其直接消费者产生值。递归中更深层次的调用不会产生顶级调用者将看到的值。