次のコードは、文字列のすべての順列を生成します。
def permutations(Word):
if len(Word)<=1:
return [Word]
#get all permutations of length N-1
perms=permutations(Word[1:])
char=Word[0]
result=[]
#iterate over all permutations of length N-1
for perm in perms:
#insert the character into every possible location
for i in range(len(perm)+1):
result.append(perm[:i] + char + perm[i:])
return result
それがどのように機能するか説明できますか?再帰がわかりません。
アルゴリズムは次のとおりです。
再帰の基本ケースは1文字です。 1文字を並べ替える方法は1つだけです。
実例
開始ワードがbar
であると想像してください。
b
を削除します。ar
のpermuatationsを見つけます。これにより、ar
とra
が得られます。b
を配置します:ar
-> bar
、abr
、arb
ra
-> bra
、rba
、rab
以下に、長さ2の文字列と長さ3の文字列の手順を記述しました。
permutations( 'ab')
len('ab') is not <= 1
perms = permutations of 'b'
len('b') <= 1 so return 'b' in a list
perms = ['b']
char = 'a'
result = []
for 'b' in ['b']:
for 0 in [0,1]:
result.append('' + 'a' + 'b')
for 1 in [0,1]:
result.append('b' + 'a' + '')
result = ['ab', 'ba']
permutations( 'abc')
len('abc') is not <= 1
perms = permutations('bc')
perms = ['bc','cb']
char = 'a'
result =[]
for 'bc' in ['bc','cb']:
for 0 in [0,1,2]:
result.append('' + 'a' + 'bc')
for 1 in [0,1,2]:
result.append('b' + 'a' + 'c')
for 2 in [0,1,2]:
result.append('bc' + 'a' + '')
for 'cb' in ['bc','cb']:
for 0 in [0,1,2]:
result.append('' + 'a' + 'cb')
for 1 in [0,1,2]:
result.append('c' + 'a' + 'b')
for 2 in [0,1,2]:
result.append('cb' + 'a' + '')
result = ['abc', 'bac', 'bca', 'acb', 'cab', 'cba']