Java - duda con código

 
Vista:

duda con código

Publicado por sergio (2 intervenciones) el 16/06/2019 21:48:33
1
2
3
4
5
6
7
8
9
10
11
12
13
public class ejercicio {
     public static void main (String[] args) {
      System.out.println(espejo("teclado"));
    }
    public static String espejo(String s) {
    if (s.length() <= 1) {
        return s;
    }
    return espejo(s.substring(1)) + s.charAt(0);
 
 
    }
}

Este es el código , ¿alguien me podría explicar la función del charAt y el substring aqui?
Gracias de antemano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

duda con código

Publicado por Kabuto (1381 intervenciones) el 16/06/2019 22:17:59
El s.charAt(0) devuelve el primer caracter de la cadena que contiene s.

El s.subString(1) lo que hace es devolver la subcadena que hay desde el segundo caracter (posicion 1) hasta el final de la cadena.

Eso es por separado, pero ¿como funciona en ese código?

El método espejo() ahí escrito es un método recursivo que lo que hace es coger el primer caracter de la cadena (charAt(0)) y el resto (subString(1) se lo envía recursivamente a otra invocación del método espejo() para que haga lo mismo, es decir, coger el primer caracter de la subcadena que recibe y volver a crear otra subcadena para seguir repitiendo el proceso hasta que la subadena sea de un único caracter.

El resultado es que se construye una cadena invertida respecto a la original.

En el ejemplo se le envía la cadena "teclado". Veamos que ocurre paso a paso:

- Como el tamaño de "teclado" es mayor que 1,
lo que hace es retornar una llamada recursiva a espejo() con la subcadena "eclado" (porque hace subString(1) ) + el caracter 't' (charAt(0))

Pero este return, no se hace efectivo hasta que la llamada recursiva termine de trabajar con "eclado". ¿Y que ocurre en esta primera llamada recursiva?

- Como "eclado" es mayor que 1, se retorna una segunda llamada recursiva a espejo() esta vez con la subcadena "clado" + el caracter 'e'

De nuevo, este return no se hace efectivo hasta que la segunda llamada recursiva a espejo() termine de trabajar con "clado".
Así que tenemos dos "return" a la espera de que terminen las llamadas recursivas, y aun quedan unas cuantas.

Porque ahora otro return con una tercera llamada a espejo() con la subcadena "lado" + el caracter 'c'..

Y luego otra con "ado" + 'l'..

Y otra con "do" + 'a'...

Y otra con "o" + 'd'..

Y aquí, como por fin la subcadena se ha quedado con tamaño 1, nos encontramos con un return que NO hace llamada recursiva:
1
2
if (s.length() <= 1) {
return s;

Puesto que ya no hay llamada recursiva, todos los "return" que estaban a la espera, comienzan a hacerse efectivos, uno a uno, y por orden inverso al que han sido invocados.
Es decir, el primero que se invocó, será el último en hacerse efectivo.

Por eso, ese método nos va a dar como resultado la cadena: "odalcet"


No se si me he explicado bien, o te he liado más...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

duda con código

Publicado por sergio (2 intervenciones) el 16/06/2019 22:30:22
Muchas gracias , me ha sido de gran ayuda :).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar