2016-11-24 4 views
0

Ich schreibe einen Code "Rekursionspermutation der Zeichenfolge" in Python Es stürzte nach einem Baum (?) Zyklus. Ich kann den Grund nicht finden. Bitte erläutern Sie es.Rekursion Permutation Zeichenfolge Absturz

memory = [] 
memory2 = [] 

def permutation(s): 


if len(s)==1: 
    return s 


for i,char in enumerate(s): 
    returns= permutation(s[:i] + s[i+1:]) 
    print(returns) 
    if returns == None: 
     for j in memory: 
      memory2.append(s[i] + j) 
     memory = [] 
    memory.append(s[i] + returns) 
    print(memory) 
s = "ABC" 
print(permutation(s)) 

Nachdem er den Speicher gebildet [cb, bc] Es sollte für Schleife zum nächsten geht. aber es endet einfach.

+2

Können Sie den Absturz veröffentlichen? Welcher Fehler wird ausgelöst und welche Zeile verursacht es? – Omada

+0

Angenommen, dies ist kein Fehler beim Kopieren und Einfügen, müssen Sie den Einzug in Ihrem Code korrigieren. –

+0

Können Sie auch 'itertools.permutations' verwenden? –

Antwort

0

Ich glaube, Sie haben vergessen 'else' in Ihrem Zustand:

memory = [] 
memory2 = [] 

def permutation(s): 
    global memory 
    global memory2 

    if len(s)==1: 
     return s 

    for i, char in enumerate(s): 
     returns = permutation(s[:i] + s[i+1:]) 

     if returns == None: 
      for j in memory: 
       memory2.append(s[i] + j) 
      memory = [] 
     else: # <--- here 
      memory.append(s[i] + returns) 

s = "ABC" 
permutation(s) 
print(memory2) 
0

Sie Ihre Funktion wie so korrigieren:

def permutations(s): 
    if len(s) <= 1: 
     return [s] 
    result = [] 
    for i, letter in enumerate(s): 
     for perm in permutations(s[:i] + s[i + 1:]): 
      result.append(letter + perm) 
    return result 

oder verwenden Standard-Library-Funktion itertools.permutations:

from itertools import permutations 
perms = ["".join(perm) for perm in permutations(s)] 

beide ergeben das gleiche Ergebnis:

s = "abc" 
print(permutations(s)) # ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']