我使用递归来获得列表的排列。以下是我写的,但是yield
版本不起作用:
def test_permutation_rec():
print "test 2"
permutation_rec2([1,2,3],[])
print "test 1"
for one in permutation_rec1([1,2,3],[]):
print "one:",one
def permutation_rec1(onelist,prelist):
if onelist == [] :
print prelist
yield prelist
lenlist= len(onelist)
for i, oneitem in enumerate(onelist) :
leftlist = [onelist[j] for j in range(0,lenlist) if j != i]
permutation_rec1(leftlist,prelist + [oneitem])
def permutation_rec2(onelist,prelist):
if onelist == [] :
print prelist
lenlist= len(onelist)
for i, oneitem in enumerate(onelist) :
leftlist = [onelist[j] for j in range(0,lenlist) if j != i]
permutation_rec2(leftlist,prelist + [oneitem])
if __name__ == "__main__":
test_permutation_rec()
结果是:
^{pr2}$我想我在this the answer中使用了yield
。在
有人能告诉我为什么yield
不起作用吗?在
顺便说一下,leftlist = [onelist[j] for j in range(0,lenlist) if j != i]
在permutation_rec2
里,我觉得很难看。当列表很大时,它会创建许多临时列表。我该如何改进呢?在
您需要传递递归调用的结果;每个调用都会返回一个生成器,并且您必须对其进行迭代。您链接到的答案当然也会在递归调用上循环。在
在
permutation_rec1()
上添加一个for
循环,并将每个结果值传递给下一个调用方:如果您使用的是python3.3或更新版本,则可以使用新的^{} generator delegation syntax :
^{pr2}$相关问题 更多 >
编程相关推荐