Cómo Reverse una cadena en Java usando recursividad

⚡ Resumen inteligente

Reversing una cuerda en Java La recursión funciona eliminando el primer carácter, invirtiendo lo que queda y añadiendo ese primer carácter al final. Una cadena vacía detiene las llamadas y desenrolla la pila.

  • 🔘 Caso base: El método devuelve un valor inmediatamente cuando isEmpty() informa que no queda nada que revertir.
  • ☑️ Paso recursivo: substring(1) elimina el primer carácter y charAt(0) lo vuelve a colocar después del resto invertido.
  • Inmutabilidad: Cada llamada produce un nuevo objeto String, porque Java Una cadena de texto nunca se puede editar directamente.
  • 🧪 Trace: Guru99 se convierte en 99uruG después de siete llamadas, una por cada carácter más el caso base vacío.
  • 🛠️ Opciones más rápidas: Tanto StringBuilder.reverse() como un intercambio de dos punteros a toCharArray() finalizan en una sola pasada.
  • 📌 Costo: La recursión con substring() se ejecuta en tiempo cuadrático y ocupa un marco de pila por carácter.

Java Programa que invierte una cadena utilizando un método recursivo.

En este programa de ejemplo, invertiremos una cadena ingresada por un usuario.

Crearemos una función para invertir una cadena. Later Lo llamaremos recursivamente hasta que todos los caracteres estén invertidos. La recursión es adecuada para este problema porque una cadena invertida es simplemente la cola invertida de la cadena con el primer carácter original añadido al final, lo que representa el mismo problema con un carácter menos.

Escribir el Java Programa para Reverse Cordón

La clase que se muestra a continuación declara la entrada en main(), la pasa a reverseString() e imprime el resultado. Dos llamadas a println() dentro del método hacen que cada paso recursivo sea visible en la consola.

package com.guru99;
 
public class ReverseString {
 
	public static void main(String[] args) {
 
 
		String myStr = "Guru99";
 
 
		//create Method and pass and input parameter string 
		String reversed = reverseString(myStr);
		System.out.println("The reversed string is: " + reversed);
		
	}
 
 
	//Method take string parameter and check string is empty or not
	public static String reverseString(String myStr)
	{
		if (myStr.isEmpty()){
		 System.out.println("String in now Empty");	
		 return myStr;
		}
		//Calling Function Recursively
		System.out.println("String to be passed in Recursive Function: "+myStr.substring(1));
		return reverseString(myStr.substring(1)) + myStr.charAt(0);
	}
 
}

Code Salida:

Cada línea de la salida representa una llamada recursiva. El último carácter impreso en cada línea es un carácter más corto que el de la línea anterior, y la última línea muestra el resultado invertido.

String to be passed in Recursive Function: uru99
String to be passed in Recursive Function: ru99
String to be passed in Recursive Function: u99
String to be passed in Recursive Function: 99
String to be passed in Recursive Function: 9
String to be passed in Recursive Function: 
String in now Empty
The reversed string is: 99uruG

Cómo la recursiva Reversal Works Paso a Paso

Dos líneas contienen todo el método. El caso base, if (myStr.isEmpty()), le da a la recursión un punto donde detenerse. La línea recursiva, return reverseString(myStr.substring(1)) + myStr.charAt(0), divide el trabajo en dos: substring(1) es todo lo que sigue al primer carácter, y charAt(0) es ese primer carácter, agregado. después el resto invertido.

Tracla entrada GuruEl número 99 deja clara la orden. Java Envía un fotograma por cada llamada antes de que se produzca cualquier concatenación:

Llame hoy almiStrPasado a la siguiente llamada.Expresión esperando a terminar
1Guru99uru99cadena inversa(“uru99”) + G
2uru99ru99cadena inversa(“ru99”) + u
3ru99u99reverseString(“u99”) + r
4u9999cadena inversa(“99”) + u
5999cadena_inversa(“9”) + 9
69(Vacío)cadena inversa(“”) + 9
7(Vacío)Se alcanzó el caso basedevuelve la cadena vacía

La pila se desenrolla de abajo hacia arriba y cada marco agrega su carácter guardado: la cadena vacía se convierte en 9, luego en 99, luego en 99u, 99ur, 99uru y finalmente 99uruG. Porque Java Las cadenas son inmutables; ninguno de estos valores intermedios sobrescribe el anterior: cada concatenación asigna un nuevo objeto String.

Hay dos detalles en la salida de la consola que merecen ser mencionados. La sexta línea termina vacía después de los dos puntos, ya que la función substring(1) aplicada a una cadena de un solo carácter devuelve la cadena vacía en lugar de null. El mensaje que sigue dice "String in now Empty" en el programa original; la frase es un error tipográfico y debería decir "String is now empty", por lo que se ha dejado sin modificar para que el código y la salida anterior coincidan línea por línea.

Otras formas de Reverse una cadena en Java

La recursión es la forma más clara de ver La reversión puede ocurrir, pero rara vez se realiza de la forma en que lo hace el código de producción. Tres alternativas cubren casi todos los casos reales.

1. StringBuilder.reverse() es la más corta y la más rápida. La clase incluye un método reverse() integrado, por lo que todo el trabajo cabe en una sola línea:

String reversed = new StringBuilder(myStr).reverse().toString();

2. Un bucle for con charAt() Recorre la cadena hacia atrás desde el último índice hasta cero. Los entrevistadores suelen pedir esta versión porque muestra la lógica en lugar de delegarla:

String reversed = "";
for (int i = myStr.length() - 1; i >= 0; i--) {
    reversed = reversed + myStr.charAt(i);
}

3. Un intercambio de dos punteros a toCharArray() convierte la cadena en una matriz de caracteres y luego intercambia los caracteres más externos hacia adentro hasta que los punteros se encuentran en el medio:

char[] chars = myStr.toCharArray();
int left = 0;
int right = chars.length - 1;
while (left < right) {
    char temp = chars[left];
    chars[left] = chars[right];
    chars[right] = temp;
    left++;
    right--;
}
String reversed = new String(chars);

La misma técnica de matriz invierte una secuencia numérica o cualquier otra colección ordenada, razón por la cual aparece en Java matriz ejercicios con la misma frecuencia que en los de cuerda.

Complejidad temporal y espacial de cada enfoque

Las cuatro versiones no cuestan lo mismo. Ambas entradas cuadráticas que aparecen a continuación comparten una causa: crean una cadena completamente nueva en cada paso, y copiar n caracteres n veces supone un trabajo de n al cuadrado.

Nuevo enfoqueHoraEspacio extraPor qué
Recursión con subcadena()O (n²)O (n²)La función substring() copia los caracteres restantes en cada llamada, y se mantiene un marco de pila por cada carácter.
Bucle for con charAt() y +O (n²)O (n²)Cada concatenación asigna una nueva cadena y copia todo lo recopilado hasta ahora.
StringBuilder.reverse()O (n)O (n)Un búfer mutable, una pasada y los pares sustitutos se mantienen intactos.
Dos punteros a toCharArray()O (n)O (n)Una copia de la matriz, luego n/2 intercambios sin asignación adicional.

Elija la versión recursiva para aprender o para demostrar cómo se comporta la pila de llamadas, la versión de matriz de caracteres cuando un entrevistador pida la lógica a mano, y StringBuilder.reverse() en cualquier cosa que se distribuya. La misma compensación entre una solución de enseñanza y una de producción aparece en todos los ejercicios clásicos, desde ordenamiento de burbuja y conectar Serie de Fibonacci a comprobaciones de números primos; vale la pena practicar cada uno de ellos Java en ambos sentidos.

Preguntas Frecuentes

Los objetos String son inmutables, por lo que los caracteres que contienen nunca pueden cambiar después de su creación. Por lo tanto, cada operación inversa crea un nuevo objeto. Utilice StringBuilder o un array de caracteres cuando sea necesario modificar los caracteres sin asignar un nuevo objeto String en cada paso.

La primera llamada a isEmpty() genera una NullPointerException, ya que el método se invoca sobre un objeto vacío. Proteja el punto de entrada con una comprobación de nulidad que devuelva null o genere una IllegalArgumentException antes de que comience cualquier recursión.

No es del todo fiable. charAt() funciona con unidades de código de 16 bits, por lo que un carácter almacenado como par subrogado se divide y el texto invertido muestra cuadrados de reemplazo. StringBuilder.reverse() mantiene los pares subrogados juntos, lo que lo convierte en la opción más segura para texto Unicode.

StringBuilder, en casi todos los casos. Ambos exponen el mismo método reverse(), pero StringBuffer Sincroniza cada llamada, lo que reduce la velocidad. Elegir CadenaBuffer solo cuando un búfer se comparte realmente entre hilos.

Divide la oración por espacios en blanco con split(” “), luego recorre el array resultante desde el último índice hasta el primero, agregando cada palabra a un StringBuilder. Los caracteres dentro de cada palabra permanecen en su orden original.

Se utiliza un marco de pila por carácter, por lo que normalmente se necesitan unos pocos miles de caracteres antes de que aparezca un StackOverflowError. El límite exacto depende del tamaño de la pila del hilo de la JVM. Cualquier versión iterativa evita por completo el límite superior.

Un asistente de IA puede leer una pila trace) Señala un caso base faltante o inalcanzable y explica el orden en que se desenrollan los marcos. También incluye pruebas de casos límite para entradas vacías, de un solo carácter y nulas. Verifica el razonamiento con una ejecución real.

Sí. Copilot Por lo general, completa todo el método inverso a partir de la firma, ofreciendo a menudo primero la forma StringBuilder. Verifica el caso base y la complejidad, ya que la sugerencia más corta no siempre es la versión que se solicita en un ejercicio.

Resumir este post con: