2017-07-07 2 views
1

gars. Il semble que je ne comprenne pas vraiment le concept des fonctions du générateur Python, parce que je n'ai pas compris l'erreur dans ce code qui est censé produire toutes les permutations des caractères chaîne.Algorithme de permutation naïf que la fonction de générateur python ne prend pas en charge

Par exemple, celui-ci est basé sur l'expansion de jeu simple et il fonctionne

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

Pendant ce temps, ce code ne fonctionne pas: list(g) fournit []

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

Utilisez-vous Python3.3 ou supérieur? –

Répondre

2

Lorsque vous appelez récursive gen_perm(), vous ne faites rien avec la valeur de retour.

Essayez cela, si yield from est disponible dans votre version Python (3.3 et plus):

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

Ou ceci fonctionne sur toutes les versions de 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

Il peut être utile de noter explicitement que le premier extrait est pour Python 3.X et le second pour les deux versions. –

+0

Merci, @JaredGoguen! –

+0

@ Robᵩ, merci, maintenant je suis d'accord avec cette chose –