En la página ya teníamos publicados dos artículos sobre como invertir una cadena en Java. Por un lado podíais ver como invertirla utilizando un bucle y por otro apoyándonos en el método reverse de un StringBuilder. Pero en el día de hoy vamos a ver como podemos invertir una cadena con recursividad en Java.
Lo primero que tenemos que saber para poder invertir una cadena con recursividad en Java es el concepto de recursividad. Podríamos decir que la recursividad consiste en ejecutar un mismo código un número de veces limitado para luego acabar dando como resultado la agregación de todas estas ejecuciones. Si bien está agregación se ejecutará de forma inversa, el decir lo primero será lo último ejecutado.
Para poder invertir una cadena con recursividad en Java nos vamos a apoyar en esa ejecución inversa. Lo primero será crear la función reverse.
public String reverse(String palabra) {
...
}
Como vemos lo que recibe la función reverse es una cadena. Dentro de las funciones preparadas para la recursividad siempre hay una comprobación por la cual nos saldremos de la ejecución y otra con la cual llamaremos a la función.
En este caso el fin de la ejecución será cuando la palabra solo tenga un carácter.
public String reverse(String palabra) {
if (palabra.length() == 1)
return palabra;
}
En el caso contrario lo que haremos será llamar a la función nuevamente, pero en este caso la llamaremos con el contenido de la palabra a partir del segundo carácter.
public String reverse(String palabra) {
if (palabra.length() == 1)
return palabra;
else
return reverse(palabra.substring(1));
}
Pero todavía tenemos que tener en cuenta es qué hacer con el carácter que nos queda en la pila. Es decir, el carácter que está en la posición 0. Este carácter habrá que añadirlo al final de la cadena para conseguir que esté invertida.
Por lo que nuestro código para invertir una cadena con recursividad en Java será el siguiente:
public String reverse(String palabra) {
if (palabra.length() == 1)
return palabra;
else
return reverse(palabra.substring(1)) + charAt(0);
}