2017-07-07 4 views
1

Jungs. Es scheint, als ob ich das Konzept der Python-Generatorfunktionen nicht wirklich verstehe, weil ich in diesem Code keinen Fehler gefunden habe, der alle Permutationen der String-Zeichen erzeugen soll.Naive Permutation Algorithmus, dass Python-Generator-Funktion nicht unterstützt

Zum Beispiel ist dies ein basiert auf einfachen Satz Expansion und es funktioniert

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') 

Inzwischen ist dieser Code nicht funktioniert: list(g) bietet []

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

Verwenden Sie Python3.3 oder höher? –

Antwort

2

Wenn Sie rekursiv gen_perm() nennen, Sie tun nichts mit dem Rückgabewert.

die Sie interessieren, wenn yield from in Ihrer Python-Version (3.3 und höher) verfügbar:

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

Oder diese auf allen Python-Versionen funktionieren.

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

Es lohnt sich, explizit darauf hinzuweisen, dass das erste Snippet für Python 3.X und das zweite für beide Versionen geeignet ist. –

+0

Danke, @JaredGoguen! –

+0

@ Robo, danke, jetzt bin ich mit diesem Ding OK –