2012-06-26 67 views
1

我正在嘗試爲排列練習編寫生成器函數。但它不會返回任何東西。 但是,如果我用''lis.append(new [k])'替換 ''ield new [k]''',那麼我會得到正確的排列列表。我是否在屈服方面做錯了什麼?Python 3練習:生成排列

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) 
+0

Ick。不要使用標籤! –

+0

標籤有什麼問題? – user1470575

+0

他們打破格式。他們只能小心使用,這是不值得的。永遠不要在源文件中有一個選項卡。如果您需要在某些文本中添加一個製表符,請將它寫爲''\ t'' –

回答

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) 

其中一期工程。

然後下一步就是擺脫全局變量。

+0

謝謝。通過擺脫全局變量,你的意思是定義像排列(tup)這樣的另一個函數,並將這些變量包含在該函數的定義中? – user1470575

+0

@ user1470575:嗯,我的意思是將變量放在現有的'repeat()'函數中。但這並不總是正確的解決方案,但另一個包裝函數很少正確。有時候班級是一個很好的解決方案。 –

0

我認爲你正在嘗試編寫一個算法來生成多個長度的排列,使用生成器進行練習。

試穿尺寸爲這樣一個問題: How to generate all permutations of a list in Python

你需要轉換爲python3,這不應該是一個大問題。

不幸的是,我認爲你的問題在於你的算法,而不是你使用yield,這對我來說看起來沒問題。

+0

我正在存儲較短長度的排列,因爲在生成一個全長排列之後,我只想增加最後一個條目以生成一個新的全長排列 – user1470575