1

我正在尝试编写一个生成器函数来进行置换练习。但它不返回任何东西。但是如果我用 ''lis.append(new[k])'' 替换 ''yield new[k]'',那么我会得到正确的排列列表。我在产量方面做错了吗?

tup=(1,2,3) # tup can be any sequence
new=[[]]*(len(tup)+1) # memory; new[0]=[], new[1] will be length 1 permutation, etc.
lis=[]  # the list of permutations

def repeat(k): # recursion
    for i in tup:
        if i in new[k-1]:
            continue # permutation can't repeat
        else: new[k]=new[k-1]+[i]

        if k==len(tup): 
             yield new[k]
        else:
             repeat(k+1)

gen=repeat(1)
for i in gen:
    print(i)
4

2 回答 2

0

我认为您正在尝试编写一种算法来使用生成器生成多个长度的排列以进行练习。

试试这个问题的大小: How to generate all permutations of a list in Python

你需要翻译成python3,这应该不是什么大问题。

不幸的是,我认为您的问题在于您的算法,而不是您对 的使用yield,这对我来说看起来不错。

于 2012-06-26T02:33:32.167 回答
0

这是一个递归函数,但您不会从递归中传递值,这就是它不返回任何内容的原因。

您需要将呼叫更改为

repeat(k+1)

for x in repeat(k+1):
    yield x

然后得到的函数是:

tup=(1,2,3) # tup can be any sequence
new=[[]]*(len(tup)+1) # memory; new[0]=[], new[1] will be length 1 permutation, etc.
lis=[]  # the list of permutations

def repeat(k): # recursion
    for i in tup:
        if i in new[k-1]:
            continue # permutation can't repeat
        else: new[k]=new[k-1]+[i]

        if k==len(tup): 
             yield new[k]
        else:
             for x in repeat(k+1):
                 yield x

for i in repeat(1):
    print(i)

哪个有效。

下一步是摆脱全局变量。

于 2012-06-26T04:50:53.070 回答