Je suis nouveau en python et très mauvais pour penser de manière récursive. Ce code me donne un IndexError: string index out of range . Et je ne sais pas comment le corriger.
Traceback (most recent call last):
File "soRecursivePermutations.py", line 25, in <module>
get_permutations('abc')
File "soRecursivePermutations.py", line 23, in get_permutations
return permutation(sequence)
File "soRecursivePermutations.py", line 20, in permutation
permutationhelp(sequence,"")
File "soRecursivePermutations.py", line 12, in permutationhelp
c= sequence[i]
IndexError: string index out of range
Exemple:
get_permutations('abc')
['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
Le suivi est le suivant:
def get_permutations(sequence):
def permutationhelp(sequence,chosen):
if sequence=="":
print(chosen)
else:
for i in range(len(sequence)):
c= sequence[i]
chosen +=c
sequence=sequence[i+1:]
permutationhelp(sequence,chosen)
sequence=c+sequence
chosen=chosen[:-1]
def permutation(sequence):
permutationhelp(sequence,"")
return permutation(sequence)
5 Réponses :
Devrait fortement envisager d'utiliser:
perm = [''.join(p) for p in itertools.permutations('abc')]
Ou si vous souhaitez stocker dans list:
import itertools
for p in itertools.permutations("abc"):
print(''.join(p))
# abc
# acb
# bac
# bca
# cab
# cba
p>
Je crois qu'OP essaie d'apprendre la manière récursive de faire cela. Avez-vous une réponse à cela?
merci, mais je suis nouveau. Et j'essaie de comprendre comment fonctionne la récursivité et comment je peux penser récursive. Je ne veux pas importer itertools
C'est correct, mais l'OP semble vouloir une solution récursive
La raison de votre traçage est ici:
['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
La première ligne laisse la séquence avec juste la fin de la chaîne. et la troisième ligne n'ajoute qu'un seul caractère à la séquence , donc la séquence devient plus courte à mesure que vous parcourez la boucle.
Cependant, ceci est probablement le programme que vous recherchiez:
# https://stackoverflow.com/a/53088155/4834
def remove_at(i, s):
return s[:i] + s[i + 1:]
def permutationhelp(sequence, chosen, collect):
if sequence == "":
collect.append(chosen)
else:
for i,c in enumerate(sequence):
permutationhelp(remove_at(i, sequence), chosen + c, collect)
def get_permutations(sequence):
collect = []
permutationhelp(sequence, "", collect)
return collect
print(get_permutations('abc'))
Sortie:
sequence=sequence[i+1:] permutationhelp(sequence,chosen) sequence=c+sequence
Je pense que vous voudrez peut-être l'aborder différemment. En suivant votre code, je pense que vous voulez simplement réduire la liste et imprimer le résultat sur la console lorsque vous manquez de séquence, mais je ne vois aucune logique pour la permutation réelle. Pardonne-moi si c'est là et je l'ai manqué.
Voici comment j'y pense. Commencez par le premier élément "a", gardez un index "i" pour le passer dans votre fonction d'assistance puis échangez avec une liste qui n'inclut pas "a" donc dans ce cas ce serait "b et c". Puis concattez cela avec votre caractère d'index "i", et débloquez également la liste un avec ce même caractère à nouveau. Cela afficherait "abc et acb".
Ensuite, j'incrémentais le "i" et j'appelais à nouveau votre assistant. Alors maintenant, votre élément est "b" et la liste de permutation est "a et c" et produit "bac" et "bca". Puis incrémentez et répétez à nouveau, ce qui produit "cab" et "cba". Vous pouvez avoir votre cas de base de récursion comme i étant le même que len (séquence). J'espère que je ne t'ai perdu nulle part. Je ne l'ai pas codé parce que je pensais que vous essayiez d'apprendre en faisant. Bonne chance!
J'ai dû le copier pour découvrir le problème, l'exception indique clairement que vous essayiez d'accéder à un index plus long que le tableau fourni.
J'ai modifié peu de choses dans votre solution.
J'ai arrêté la dépendance de la variable "choisie" dans la récursivité
Je lui ai fait renvoyer une liste des résultats.
['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
résultat:
def get_permutations(sequence):
def permutationhelp(sequence):
if len(sequence) == 1:
return sequence
result = []
for i in range(len(sequence)):
c = sequence[i]
remaining = sequence[:i] + sequence[i+1:]
for perm in permutationhelp(remaining):
result.append(c + perm)
return result
def permutation(sequence):
result = permutationhelp(sequence)
print(result)
return permutation(sequence)
get_permutations('abc')
@quamrana a donné la bonne explication. Ici, je pense que les codes suivants sont plus utiles pour OP pour comprendre son erreur et l'algorithme récursif.
>>> get_permutations('abc')
abc
acb
bac
bca
cab
cba
testcase
def get_permutations(sequence):
def permutationhelp(sequence, chosen):
if sequence == "":
print(chosen)
else:
for i in range(len(sequence)):
c = sequence[i]
chosen += c
sequence = sequence[:i] + sequence[i+1:]
permutationhelp(sequence,chosen)
sequence = sequence[:i] + c + sequence[i:]
chosen = chosen[:-1]
def permutation(sequence):
permutationhelp(sequence,"")
return permutation(sequence)
Veuillez mettre à jour votre question avec la façon dont vous appelez la fonction, les données d'entrée et les données de sortie attendues, ainsi que le texte intégral de la trace d'erreur que vous voyez.
Une autre chose qui nous serait utile, est de savoir si vous pouviez fournir ce que vous prévoyez de se produire? C'est à dire. Quel devrait être le résultat lorsque vous appelez
get_permutations ().