2016-12-09 6 views
0

このコードは私に深刻な頭痛を与えました。これは、文字列を入力とし、すべての '{}'を可能なすべての文字の組み合わせに置き換え、基本的にitertools.permutations()と同様のやり方で動作しますが、定数値を追加するジェネレータです。Pythonプログラムが無限ループに詰まっています

個々の要素を確認したところ、インクリメント機能が無限ループに変わったようです。しかし、生成される文字列の数を減らすと、うまくいくように見えます。 考えられるすべての値を返そうとしたときにプログラムが失敗する理由を誰かに説明することはできますか? itertoolsを使用せずに同じことをしなければならないと仮定して、どのようにタスクを達成しますか?

def string_char_combinations(string, chars=False): 
    if not chars: 
     chars = [chr(i) for i in range(ord('a'), ord('z')+1)] 
    varcount = string.count('{}') 
    a = [0 for i in range(varcount)] 

    def increment(lst, n): 
     if n == 0: 
      return lst ##ERROR: Infinite loop? 
     print(n) 
     lst[n] += 1 
     print(lst) 
     if lst[n] > len(chars)-1: 
      lst[n] = 0 
      lst = increment(lst, n-1) 
     return lst 

    while a[0] < len(chars)-1: 
     a = increment(a, len(a)-1) 
     yield string.format(*[chars[i] for i in a]) 

if __name__ == "__main__": 
    print(list(string_char_combinations("a{}{}a"))) 
+1

あなたのインクリメント機能であり、n == 0の場合には、常にそのため、あなたはループから抜け出すことはできません。中に入ったLSTの同じ値を返します。 。 lst [n] + = 1の後にnのチェックをしますか? – Leo

答えて

0

あなたはnここ デフ増分(LST、n)はincrementeません: 戻りLST ## ERROR:無限ループのn == 0の場合 を?

のでnの値は常に0

関連する問題