最近、重要な制約を持つ特定のシーケンスを生成する関数を作成しました。問題は自然な再帰的解決策にありました。たまたま、入力が比較的少ない場合でも、シーケンスは数千になります。したがって、リストにすべてのシーケンスを入力するのではなく、ジェネレーターとしてアルゴリズムを使用したいと思います。
ここに例。再帰関数を使用して文字列のすべての順列を計算するとします。次の素朴なアルゴリズムは、追加の引数 "storage"を取り、それが見つかるたびに順列を追加します。
def getPermutations(string、storage、prefix = ""):if len(string) == 1:storage.append(prefix + string)#< ----- else:for i in range(len(string)):getPermutations(string [:i] + string [i + 1:]、storage 、prefix + string [i])storage = [] getPermutations( "abcd"、storage)ストレージ内の順列:print permutation
(非効率性については気にしないでください。これは例。)
ここで、関数をジェネレーターに変換します。つまり、ストレージリストに追加するのではなく、並べ替えを生成します。
def getPermutations(string 、prefix = ""):if len(string)== 1:yield prefix + string#< ----- else:for i in range(len(string)):getPermutations(string [:i] + string [i + 1:]、prefix + string [i])getPermutations( "abcd")の順列:print permutation
このコードは機能しません(関数はemのように動作しますptyジェネレーター)。
何かが足りませんか?上記の再帰的アルゴリズムを反復アルゴリズムに置き換えることなくジェネレータに変換する方法はありますか?