これはないは、順列を生成しません。これは、n次元のデカルト積を生成する。 (プロセスでは、それはまた、すべての順列を生成しますが、のみ順列を生成するためのアルゴリズムが異なるだろう。)
それは、それがどのように動作するかを説明するために少し難しいですが、あなたは小さな入力に対する出力を見れば、あなたは何が起こっているか見ることができます。 'abc'
と[None] * 3
のための出力を考えてみましょう(私は真の発電機として機能するようにコードを修正):
>>> def generate(charlist,state,position):
... for i in charlist:
... state[position] = i
... if position == (len(state)-1):
... yield "".join(state)
... else:
... for j in generate(charlist,state,position+1):
... yield j
...
>>> print list(generate('abc', [None] * 3, 0))
['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc',
'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc',
'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']
あなたが見ることができるように、何が起こるかからposition
たびに(インクリメント、つまり最初に、generate
通話自体3倍0
〜1
〜2
)。 recursion-loopを実行するたびに、'a'
が現在の位置に置かれ、state
リストの最後に達しているかどうかがテストされます。もしそうなら、それは結果をもたらし、はではありません。この場合
、それが起こる、position == 2
。今度はfor
ループが起動し、'b'
と'c'
をstate[2]
に格納し、それぞれの状態を生成します。その後、関数は終了し、制御は呼び出し側に返されます(position == 1
)。その後、呼び出し側はforループを継続します。 state[1] = 'b'
を設定してからposition
がstate
リストの終わりになくなったので、それは再び自身を呼び出します...今度はposition == 2
、forループはstate[2] == 'a'
、'b'
、'c'
などとなります。あなたはpythonでデカルト積を計算したい場合はところで
は、ここでは、再帰的なアルゴリズムを解析するためにあなたの読者を必要としない良い方法です:
>>> import itertools
>>> [''.join(c) for c in itertools.product('abc', 'abc', 'abc')]
['aaa', 'aab', 'aac', 'aba', 'abb', 'abc', 'aca', 'acb', 'acc',
'baa', 'bab', 'bac', 'bba', 'bbb', 'bbc', 'bca', 'bcb', 'bcc',
'caa', 'cab', 'cac', 'cba', 'cbb', 'cbc', 'cca', 'ccb', 'ccc']
また
を行うことができます与えられた文字の組み合わせ(3番目の引数が非ゼロでない限り)
>>> [''.join(c) for c in itertools.product(*['abc'] * 3)]
関数を返すことはありません。したがって、関数は正しく再帰しません。 –
私たちは行く、それが完璧なことを確認し、コードも同様に動作します。あなたがジャコブと言ったことにマッチするタイトルも編集しました。 – TheEliteNoob
@ Jakob Bowyer再帰関数は、それ自身を呼び出す関数です。 –