我在CS61a遇到了一个problem:
给定一个唯一元素的序列,该序列的排列是以某种任意顺序包含该序列的元素的列表.例如,
[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([1, 2, 3])))
以上代码输出预期结果:
[[1, 2, 3], [2, 1, 3], [2, 3, 1], [1, 3, 2], [3, 1, 2], [3, 2, 1]]
我的怀疑是,它看起来不应该有正确的输出.在我的代码中,generator
是递归构建的,generator(list_seq[1:])
的yield
行出现在generator(list_seq)
行之前,它应该首先产生其子序列的置换,然后才是序列本身的置换.但前者甚至没有出现在输出中.
有人能解释一下吗?也许我对发电机的工作原理有错误的理解.