web-dev-qa-db-ja.com

文字列のすべての順列を取得するために、このアルゴリズムを説明してください

次のコードは、文字列のすべての順列を生成します。

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

それがどのように機能するか説明できますか?再帰がわかりません。

14
gran_profaci

アルゴリズムは次のとおりです。

  • 最初の文字を削除します
  • 残りの文字のすべての順列を検索します(再帰ステップ)
  • 削除された文字をすべての可能な場所に再挿入します。

再帰の基本ケースは1文字です。 1文字を並べ替える方法は1つだけです。

実例

開始ワードがbarであると想像してください。

  • まず、bを削除します。
  • arのpermuatationsを見つけます。これにより、arraが得られます。
  • これらの単語ごとに、すべての場所にbを配置します:
    • ar-> barabrarb
    • ra-> brarbarab
54
Mark Byers

以下に、長さ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']  
7
tbradley22