Écrire une fonction récursive qui inverse la chaîne d'entrée
J'ai lu le livre de C++ Pour tout le monde et l'un des exercices que dit l'écriture d'une fonction string reverse(string str)
où la valeur de retour est l'inverse de str
.
Quelqu'un peut-il écrire un peu de code simple et il m'expliquer? J'ai été regarder à cette question depuis hier et ne peut pas le comprendre. Le plus loin que j'ai eu est d'avoir le retour de la fonction de la première lettre de str
(encore que je ne sais pas comment c'est arrivé)
C'est ce que je suis (Une heure après l'affichage de cette question):
string reverse(string str)
{
string word = "";
if (str.length() <= 1)
{
return str;
}
else
{
string str_copy = str;
int n = str_copy.length() - 1;
string last_letter = str_copy.substr(n, 1);
str_copy = str_copy.substr(0, n);
word += reverse(str_copy);
return str_copy;
}
return word;
}
Si je rentre "Loup", il renvoie Wol. Quelqu'un peut m'aider ici
Si je return word
au lieu de return str_copy
puis-je obtenir un w
Si je return last_letter
puis-je obtenir un l
Ce n'cette question ont à faire avec un récursive de la fonction? Et qu'entendez-vous par livre?
L'approche récursive ou itérative:)?
une fonction récursive..."
Ahh! Désolé, je viens de lire la question, ne regarde pas le titre.
OriginalL'auteur Alex | 2011-04-22
Vous devez vous connecter pour publier un commentaire.
J'ai deux minutes, donc je vais plutôt expliquer l'algorithme récursif lui-même. Prenez, par exemple, "entrée", ce qui devrait produire "tupni". Vous pouvez inverser la chaîne de manière récursive par
J'ai essayé de mise en œuvre de cette aide de C++ et la vitesse est très lente comparé à l'utilisation d'un itérateur
La sélection d'un algorithme nécessite souvent le choix entre vitesse d'exécution, les besoins en mémoire, et de la complexité.
Gardez à l'esprit que la question demande pour un appel récursif à la mise en œuvre.
Cette approche utilise O(n) l'espace de pile. Vous pouvez réduire ce de O(log n), par le fractionnement de la chaîne de moitié, à l'inverse de la dernière moitié, à l'inverse de la première moitié, ajouter les deux inversé moitiés ensemble, et le retour de la nouvelle chaîne. Peut-être pas aussi clair et simple que votre solution, mais pas tant que ça.
OriginalL'auteur David Harkness
Essayer celui-ci
Une fonction récursive doit avoir les propriétés suivantes
sera la cause d'une stackoverflow.
Cette fonction récursive fait de créer une chaîne de le dernier caractère et ensuite appeler lui-même à nouveau avec le reste de la chaîne à l'exclusion du dernier caractère. Le réel de commutation arrive à la dernière ligne du dernier+inversée est retourné. Si il serait dans l'autre sens il ne se passe rien.
Il est très inefficace, mais il fonctionne pour montrer le concept.
Vôtre,
Alois Kraus
Je n'ai aucune idée à quoi vous faites allusion. Peut-être l'indice à la date de votre commentaire??
OriginalL'auteur Alois Kraus
Juste pour suggérer une meilleure façon de gérer la récursivité:
Chaîne de renversement à l'aide de la récursivité en C++:
OriginalL'auteur totjammykd
Je ne vais pas écrire un véritable algorithme pour vous, mais voici un indice:
Comment sur inversant les deux ultrapériphériques de caractères, puis appliquer le même pour les caractères dans le milieu?
Oh, et si ce livre vraiment proposé
string reverse(string str)
comme une fonction de signature pour ce, de le jeter et d'acheter une bon livre à la place.string reverse(string str)
.Aussi, les algorithmes sont faciles. J'ai la mienne à l'exception de la récursivité est un concept déroutant pour moi et je ne sais pas comment écrire la fonction en utilisant la récursivité
Ne vous sentez pas mal, la récursivité est un concept difficile à saisir. Avez-vous regardé d'autres exemples, comme la récursif algorithme de Fibonacci? Essayer de travailler sur les 5e nombre de Fibonacci de manière récursive, à la main (papier) avant d'essayer d'écrire du code.
Je le croyais. Je pourrais essayer que
Le livre est le plus susceptible d'essayer d'expliquer des fonctions récursives dans les termes les plus simples possibles, sans aucun égard à l'efficacité. Que la signature du sens à partir d'un point de vue pédagogique.
OriginalL'auteur sbi
Voici ma version d'une fonction récursive qui renverse la chaîne d'entrée:
OriginalL'auteur Ann Orlova
La plus courte et la plus facile
OriginalL'auteur Prem K Chettri
1 de la ligne de solution récursive:
Vous l'appeler comme ceci:
OriginalL'auteur PieThon
Je sais que je ne devrais pas donner une solution, mais depuis, personne n'a mentionné cette solution de facilité j'ai pensé le partager. Je pense que le code est littéralement l'algorithme n'est donc pas besoin d'un pseudo-code.
Appeler utilisation:
OriginalL'auteur ArmenB
Toutes les solutions existantes en avait beaucoup trop de code qui n'a pas vraiment quoi que ce soit, donc, voici mon point de vue:
P. S. je suis tombé sur cette question en essayant de trouver une C++ moyen pour
std::string
de ces+1
pour unchar *
en C est; sans aller l'ensemble du parcours des.substr(1, s.length()-1)
, qui a l'air trop moche. S'avère, il y astd::string::npos
, ce qui signifie que jusqu'à la fin de la chaîne, et c'est déjà la valeur par défaut pour le deuxième argument, donc,s.substr(1)
est assez (et en plus, il a également semble plus efficace et sur le pair avec la simples + 1
en C).Noter, cependant, que la récursivité en général n'a pas d'échelle de l'entrée grandit, à moins que le compilateur est capable de faire ce qui est connu comme la queue de la récursivité d'optimisation. (Récursivité est rarement invoqué dans des langages impératifs.)
Toutefois, pour que la queue de la récursivité d'optimisation pour obtenir activé, il est généralement nécessaire que, (0), la récursion ne se produit que dans le
return
déclaration, et que, (1), pas d'autres opérations sont effectuées avec le résultat de l'appel récursif de retour dans la fonction parent.E. g., dans le cas ci-dessus, le
+ s[0]
est logiquement fait par le parent de l'enfant appel se termine (et probablement il serait donc, même si vous allez plus hideusess[s.length()-1] +
route), alors, il pourrait ainsi prévenir la plupart des compilateurs de faire un tail-recursion-est de l'optimisation, et donc de faire de la fonction très efficace sur de grandes entrées (si ce n'est carrément cassé à cause d'un tas d'épuisement).(Pour ce que ça vaut, j'ai tenté d'écrire un plus tail-recursion-solution à l'amiable (en prenant soin de faire croître le résultat de retour par le biais d'un argument à la fonction elle-même), mais le démontage de la binaire résultant semble suggérer que c'est plus impliqué que dans les langages comme C++, voir gcc: il n'y a pas de queue de récursivité si je retourne std::string en C++?.)
OriginalL'auteur cnst
vous pouvez implémenter votre propre inverse similaire à std::reverse.
OriginalL'auteur MORTAL
J'ai fait quelque chose comme cela, il ne le renversement en place. J'ai pris deux variables qui traverse la chaîne à partir de deux extrémité au centre de la chaîne et quand ils se chevauchent ou égal à l'autre, puis l'inversion se termine.
Prendre un exemple: entrée
string str = "abcd"
et appeler la fonction commeet incrémenter/décrémenter la variable pointeurs de manière récursive.
D'abord les pointeurs points de
'a'
et'd'
et swap, ils le point de'b'
et'c'
et l'échange. Finalementi >= j
qui appelle pour le cas de base pour être vrai, et donc la récurrence s'arrête. Le principal tenir à l'écart de cette question est de passer de la chaîne d'entrée comme référence.OriginalL'auteur Marco167
Il y a déjà quelques bonne réponse, mais je veux ajouter mon approche avec plein de travail Récursive inversion de la chaîne.
std::string
pas un c-string.OriginalL'auteur iankits
OriginalL'auteur user3674936
OriginalL'auteur srhaider
voici mes 3 chaîne de ligne de revers
stringRevers("")
.utiliser si.length()<=1)return s; au lieu de si.length()==1)return s;
OriginalL'auteur SRedouane
La question est d'écrire une fonction récursive. Ici est une approche. Pas un joli code, mais en fait ce qui est nécessaire.
std::string
pas un C-string.OriginalL'auteur SandBag_1996