Tres formas de Invertir un String

Oct 3, 2009 Codigos C# 14 comentarios

Estos son algunos ejemplos para que vean que en la programación hay muchas formas de hacer las cosas, aunque siempre hay una que es la más eficiente, aunque casi nunca es muy evidente.

Veamos como invertir un string de tres formas distintas. Por ejemplo, si tenemos el string “puntopeek”, el método devolvería “keepotnup”.

Veamos el primer ejemplo, es el que casi todos conocemos, y es muy fácil de implementar, vamos recorriendo la palabra desde el ultimo caracter hasta el primero y vamos guardando cada letra en un nuevo string, que es el que devolverá el método. El código sería algo así:

public string Invertir(string s)
{
string aux = "";
 
//Recorremos el string en orden inverso
for (int i = s.Length - 1; i >= 0; i--)
aux += s[i];
 
//retornamos la nueva cadena
return aux;
}

Otra opción (pero hay que conocer que es una pila), es ir guardando cada letra en una pila (stack), y luego cuando esten todas las letras las sacamos de la pila. Noten que en esta estructura, el primer elemento que entra, es el último en salir, por eso nos sirve también para invertir un string. El código sería este:

public string Invertir2(string s)
{
//Declaramos una pila usando genericidad.
//Esto se puede hacer con el framework 2.0
Stack stack = new Stack();
 
//Recorremos el string y vamos metiendo en la pila
//cada caracter
for (int i = 0; i < s.Length; i++)
stack.Push(s[i]);
 
string aux = "";
 
//Vamos sacando de la pila los caracteres y los
//ponemos uno a uno en un nuevo string
for (int i = 0; i < s.Length; i++)
aux += stack.Pop();
 
return aux;
}

Ahora veremos la versión recursiva del problema. Si lo analizan paso a paso, verán que hace practicamente lo mismo que Invertir2. Como verán, este método no necesita almacenar ningun caracter, ni copiar, la recursividad se encarga de todo. En realidad la recursividad funciona como una pila (Invertir2) pero no hay que declarar variables ni nada de eso. A veces algunos métodos recursivos parecen mágicos, pero una vez dominemos esta técnica dominaremos el arte de programar. Al menos lo esencial. Veamos el código:

public string Invertir3 (string s, int lenght)
//El parametro lenght es el tamaño del string s
{
//Condicion de parada
if (lenght == 1)
return s;
else
//Llamado recursivo
return Invertir3 (s.Substring(1, s.Length - 1), lenght - 1)
+ s[0].ToString();
}

Para que se den cuenta de lo que hace el método, es necesario que le hagan un debug paso a paso, y vayan viendo como se transforman las variables locales. Si tienen alguna otra solución de como Invertir un string pueden ponerla en los comentarios. Y hasta aquí este post, espero escribir un poco más seguido, pero estoy con muchos proyectos en la universidad y mucho trabajo. Han oido hablar del WinZip o el WinRar? Proximamente estaremos hablando del Algoritmo de Huffman, que se utiliza mucho en el compactación de texto y archivos.

Compartir:

14 comentarios

Forma parte de nuestra discusión y síguela de cerca

de todas las mas interesante es la ultima pero tambien es la mas mala, porque estas creando un string nuevo en cada llamado del metodo recursivo y eso es una perdida de tiempo y memoria, asi ke recomiendo la primera a todos que es la mas simple y la mas eficiente ;)

Autor: Paulo | Fecha: Mar 10, 2010.

Estoy totalmente de acuerdo con Paulo, pero casi siempre las soluciones recursivas tienden a ser mucho más eficientes que las iterativas

Autor: Tomy | Fecha: Mar 17, 2010.

DE ACUERDO CON LA PRIMERA FORMA

Autor: Jul Jhun | Fecha: Oct 20, 2010.

Pues la verdad yo siempre he usado el primer metodo, pero apesar de ser el menos indicado me parece un tanto más interezante el método recursivo, la verdad nunca pense que se pudiera invertir un string de forma recursiva

Autor: Isaac Robles Garcia | Fecha: Mar 14, 2011.

lo q no es saber recursividad..si esta en corto..obvio solo para ingenierooos!!

Autor: dan | Fecha: Sep 23, 2011.

en esta parte, for (int i = s.Length – 1; i >= 0; i–), en donde dice ” i >= 0 “, no comprendo esta mal o como funciona eso?

Autor: carlos | Fecha: Mar 8, 2012.

aaaa no esperen mmm nose porque me aparecian unas letras todo raro,pero ya lo comprendi

Autor: carlos | Fecha: Mar 8, 2012.

@carlos, a veces eso pasa por el charset que usas, o sea en vez del signo >= sale >= o algo así, deja ver si acabo de actualizar el plugin para que no pase más esto.

Autor: Tomy | Fecha: Mar 23, 2012.

Yo en la recursiva lo armaria al reves, fijense que les parece. Ademas le agrego el caso null que no estaba contemplado.
public string Invertir4 (string s)
{
//Condicion de parada
if (s != “”) {
if (s.lenght() == 1)
return s;
else
return (s[s.lenght()-1] + Invertir4 (s.Substring(0, s.length() – 2)) );
}

Autor: julian | Fecha: Abr 9, 2012.

@julian: Gracias por el aporte, siempre se agradece…

Autor: Tomy | Fecha: Abr 12, 2012.

kiero saber como poner esto en C#

estática Cad invierte (Cad cadena, int limIzq, int limDer)
si limDer = limIzq entonces regresa cadena
sino regresa invierte (cadena, limDer, limIzq+1) + cadena [limIzq]
fin

lo e pueto asi pero me marca que es un ciclo infinito

public string invierte(string cadena, int limIzq, int limDer)
{
if (limDer == limIzq)
return cadena;
else
return invierte(cadena, limDer, limIzq + 1) + cadena[limIzq];
}

y tambien asi..

//public char[] invertir (char[] cadena,int inicio,int fin)
//{
// if (fin == inicio)
// return cadena;
// else
// return invertir(cadena, fin, inicio + 1) + cadena[inicio];
//}

Autor: marco | Fecha: Sep 29, 2012.

como volteo una número de n cifras con procedimientos de recursión

Autor: luis | Fecha: Sep 3, 2014.

Todas tienen que recorrer toda la cadena… se puede invertir recorriendo sólo la mitad…
1.un puntero al primer elemento y otro al último, intercambiamos los elementos
2. movemos los punteros hacia el centro, intercambiamos

y así hasta el final.

ALEXIS — SLEXIA
SLEXIA — SIEXLA
SIEXLA — SIXELA

Sólo 3 paso en lugar de 6…

Autor: alexis | Fecha: Oct 4, 2014.

Estan bien las tres..y la recursiva esta bien.. pero bueno todos sabemos que la recursiva es linda pero mas compleja pq consume mas memoria otro ejemplo del cdigo recursivo es este.,.
public static String invertirNombre(String nombre){
String invertido=”";
int longitud=nombre.length();
String substring=”";

if(longitud!=0){
char letra=nombre.charAt(longitud-1);
invertido+=letra;
substring=nombre.substring(0, longitud-1);
invertido+=invertirNombre(substring);

}
return invertido;
}

Autor: Angel | Fecha: Nov 12, 2014.

Escribe tu comentario

Requerido.

Requerido. No público.

Si tienes alguno.