2017-07-07 33 views
1

夥計。 看來我並不真正理解Python生成器函數的概念,因爲我沒有想到在這個代碼中應該產生字符串的所有排列的錯誤。python生成器函數不支持的樸素置換算法

例如,這一個是基於簡單的設置擴張和它的作品

def permutations(seq): 
    perm_set = set() 

    def perm(cur_item_set, cur_str=''): 
     if not cur_item_set: 
      perm_set.add(cur_str) 
     else: 
      for item in cur_item_set: 
       perm(cur_item_set - set(item), cur_str + item) 

    perm(set(seq)) 

    for (i, item) in enumerate(perm_set): 
     print(i + 1, item) 

    permutations('abcdef') 

同時,該代碼不起作用:list(g)提供[]

def gen_perm(cur_item_set, cur_str=''): 
    if not cur_item_set: 
     yield cur_str 
    else: 
     for item in cur_item_set: 
      gen_perm(cur_item_set - {item}, cur_str + item) 

g = gen_perm(set('abcd')) 
+0

你使用Python3.3或更高版本? –

回答

2

當遞歸調用gen_perm(),你不會對返回值做任何事情。

試試這個,如果yield from是可以在你的Python版本(3.3及以上):

def gen_perm(cur_item_set, cur_str=''): 
    if not cur_item_set: 
     yield cur_str 
    else: 
     for item in cur_item_set: 
      yield from gen_perm(cur_item_set - {item}, cur_str + item) 

g = gen_perm(set('abcd')) 
print (list(g)) 

或者,這將在所有的Python版本。

def gen_perm(cur_item_set, cur_str=''): 
    if not cur_item_set: 
     yield cur_str 
    else: 
     for item in cur_item_set: 
      for item2 in gen_perm(cur_item_set - {item}, cur_str + item): 
       yield item2 

g = gen_perm(set('abcd')) 
print (list(g)) 
+0

值得明確指出的是,第一個代碼片段適用於Python 3.X,第二個代碼片段適用於這兩個版本。 –

+0

謝謝,@JaredGoguen! –

+0

@Robᵩ,謝謝,現在我可以用這個東西 –