Python inversion d'une chaîne à l'aide de la récursivité
Je veux utiliser la récursivité pour inverser une chaîne de caractères en python de sorte qu'il affiche les caractères en arrière (j'.e "Bonjour" devient "olleh"/"o l l e h".
J'ai écrit un qui le fait de manière itérative:
def Reverse( s ):
result = ""
n = 0
start = 0
while ( s[n:] != "" ):
while ( s[n:] != "" and s[n] != ' ' ):
n = n + 1
result = s[ start: n ] + " " + result
start = n
return result
Mais comment dois-je faire exactement cela de façon récursive? Je suis confus sur cette partie, surtout parce que je ne travaille pas avec python et la récursivité beaucoup.
Toute aide serait appréciée.
Est-ce devoirs?
OriginalL'auteur Eric | 2011-04-03
Vous devez vous connecter pour publier un commentaire.
(Très peu de gens le font lourds récursive traitement en Python, le langage de n'a pas été conçu pour cela.)
appel récursif est faite sur la sous-chaîne de s à partir du deuxième élément de e.g S[1:] vous donne s sans le premier élément). Il est en ajoutant le résultat de l'appel récursif pour le premier caractère de s, par exemple, s[0].
Quelle est la complexité
La complexité est O(n)
OriginalL'auteur Fred Foo
Pour résoudre un problème de manière récursive, trouver un cas trivial qui est facile à résoudre, et de comprendre comment obtenir à ce cas trivial par décompose le problème dans le plus simple et le plus simple des versions de lui-même.
Quelle est la première chose à faire pour inverser une chaîne de caractères? Littéralement, la première chose? Vous obtenez le dernier caractère de la chaîne, droit?
Donc l'inverse d'une chaîne est le dernier caractère, suivie par l'inverse de tout ce mais le dernier caractère, qui est l'endroit où la récursivité. Le dernier caractère d'une chaîne de caractères peut être écrite comme
x[-1]
alors que tout mais le dernier caractère estx[:-1]
.Maintenant, comment voulez-vous "en bas"? Qui est, ce qui est le cas trivial vous pouvez résoudre sans récursivité? Une seule réponse est la chaîne de caractères, qui est la même avant et marche arrière. Donc, si vous obtenez une chaîne de caractères, vous avez terminé.
Mais la chaîne vide est encore plus trivial, et quelqu'un pourrait passer que dans votre fonction, de sorte qu'il serait probablement préférable de l'utiliser à la place. Une chaîne de caractères peut, après tout, aussi être décomposé dans le dernier caractère et tout, mais le dernier caractère, c'est juste que tout, mais le dernier caractère est la chaîne vide. Donc, si nous nous occupons de la chaîne vide par un juste retour, nous sommes ensemble.
Mettre tout cela ensemble et vous obtenez:
Ou en une seule ligne:
Comme d'autres l'ont souligné, ce n'est pas la manière que vous le feriez normalement le faire en Python. Une solution itérative est va être plus rapide, et à l'aide de découpage à faire il va être encore plus rapide.
En outre, Python impose une limite sur la taille de la pile, et il n'y a pas la queue d'appel d'optimisation, donc une solution récursive serait limitée à inverser les chaînes de seulement environ un millier de caractères. Vous pouvez augmenter Python taille de la pile, mais il y aura toujours une limite fixe, alors que d'autres solutions peuvent toujours manipuler une chaîne de caractères de longueur quelconque.
OriginalL'auteur kindall
Si ce n'est pas seulement des devoirs à faire à la question et que vous êtes en train d'essayer d'inverser une chaîne de caractères pour un plus grand objectif, il suffit de faire
s[::-1]
.ou tout simplement
reversed()
reversed()
ne fait pas ce que vous pensez que cela fonctionne. 🙂^ w0w au moins expliquer
^ Peut-être que vous devriez au moins essayer vous-même? ".join( [i for i in inversé(s)]) est-ce que vous pensez que cela fonctionne, inversé retourne un inversée de l'objet que vous devez parcourir pour récupérer une chaîne de caractères.
OriginalL'auteur bradley.ayers
ou
OriginalL'auteur Jarek Przygódzki