为什么不能在递归函数中使用yield

2024-06-28 19:46:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用递归来获得列表的排列。以下是我写的,但是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里,我觉得很难看。当列表很大时,它会创建许多临时列表。我该如何改进呢?在


Tags: intest列表forifdefprintyield
1条回答
网友
1楼 · 发布于 2024-06-28 19:46:56

您需要传递递归调用的结果;每个调用都会返回一个生成器,并且您必须对其进行迭代。您链接到的答案当然也会在递归调用上循环。在

permutation_rec1()上添加一个for循环,并将每个结果值传递给下一个调用方:

def permutation_rec1(onelist, prelist):  
    if not onelist:
        yield prelist

    lenlist = len(onelist)
    for i, oneitem in enumerate(onelist):
        leftlist = [onelist[j] for j in range(lenlist) if j != i]
        for res in permutation_rec1(leftlist, prelist + [oneitem]):
            yield res

如果您使用的是python3.3或更新版本,则可以使用新的^{} generator delegation syntax

^{pr2}$

相关问题 更多 >