J'ai besoin d'un coup de pied dans la tête sur celui-ci. J'ai la fonction récursive suivante définie:
def perms(s):
if(len(s)==1):
return s
res = ''
for x in xrange(len(s)):
res += s[x] + perms(s[0:x] + s[x+1:len(s)])
return res + '\n'
perms ("abc") renvoie actuellement:
abccb
bacca
cabba
Le résultat souhaité est
abc
acd
bac
bca
cab
cba
Où est-ce que je vais mal ici? Comment puis-je penser à cela différemment pour trouver la solution?
Remarque: Je connais la fonction itertools. J'essaie de comprendre comment mettre en œuvre des permutations de manière récursive pour mon propre apprentissage. C'est pourquoi je préférerais que quelqu'un indique ce qui ne va pas dans mon code et comment penser différemment pour le résoudre. Merci!
Voilà (permutation récursive):
def Permute(string):
if len(string) == 0:
return ['']
prevList = Permute(string[1:len(string)])
nextList = []
for i in range(0,len(prevList)):
for j in range(0,len(string)):
newString = prevList[i][0:j]+string[0]+prevList[i][j:len(string)-1]
if newString not in nextList:
nextList.append(newString)
return nextList
Pour obtenir une liste de toutes les chaînes de permutation, appelez simplement la fonction ci-dessus avec votre chaîne d'entrée. Par exemple,
stringList = Permute('abc')
Pour obtenir une chaîne unique de toutes les chaînes de permutation séparées par des caractères de nouvelle ligne, appelez simplement '\n'.join
avec le résultat de cette fonction. Par exemple,
string = '\n'.join(Permute('abc'))
Par ailleurs, les résultats print
pour les deux options ci-dessus sont identiques.
Le résultat des permutations sera une collection, disons une liste. Votre code sera plus propre si vous pensez ainsi et si nécessaire, vous pouvez joindre les résultats en une seule chaîne. Un exemple simple sera
def perms(s):
if(len(s)==1): return [s]
result=[]
for i,v in enumerate(s):
result += [v+p for p in perms(s[:i]+s[i+1:])]
return result
perms('abc')
['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
print('\n'.join(perms('abc')))
abc
acb
bac
bca
cab
cba
Pas sûr de l'efficacité mais ça devrait marcher aussi.
def find_permutations(v):
if len(v) > 1:
for i in perms(v):
nv = i[1:]
for j in perms(nv):
print(i[0] + j)
else:
print(v)
def perms(v):
if not hasattr(perms, 'original'):
perms.original = v
perms.list = []
nv = v[1:] + v[0]
perms.list.append(nv)
if perms.original == nv:
l = perms.list
del perms.original
del perms.list
return l
return perms(nv)
find_permutations('abc')
Voici le code:
def fperms(elements):
if len(elements)<=1:
yield elements
else:
for p in fperms(elements[1:]):
for i in range(len(elements)):
yield p[:i]+elements[0:1]+p[i:]