2017-07-07 4 views
1

人。 文字列のすべての順列を生成するはずのこのコードで間違いを理解していないので、私はPythonジェネレータ関数の概念を実際に理解していないようです。Pythonジェネレータ関数がサポートしていないNaive置換アルゴリズム

例えば

、この1は、簡単なセットの拡張に基づいており、それが

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

一方、このコードは動作しません動作します:あなたが再帰的にgen_perm()を呼び出すと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

を提供あなたは戻り値で何もしません。

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のバージョンで動作します: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: 
      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用で、2番目のスニペットは両方のバージョンで動作することを明示的に示す価値があります。 –

+0

ありがとう、@ JaredGoguen! –

+0

@Robᵩ、ありがとう、今私はこの事でOKです –

関連する問題