Java - Necesito ayuda con este pedazo de código recursivo

 
Vista:
sin imagen de perfil
Val: 8
Ha disminuido su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Necesito ayuda con este pedazo de código recursivo

Publicado por Mati (3 intervenciones) el 03/10/2019 16:52:01
Buenos días! Primero me presento, soy Matias de Mar del Plata, estoy haciendo un curso online para principiantes de Java y estoy en la sección de operaciones recursivas.
Mi problema es que si bien entiendo que hace cada cosa, no entiendo como hace el paso a paso para que la solución sea la que se muestra en pantalla, me pierdo en algún lado y no se porque muestra ese resultado.
Código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Main{
 
 
    static void printLine(int width){
    	for (int i = 0; i< width; i ++){
	        System.out.print("*");
	    }
 
	    System.out.println();
    }
 
    static void printTriangleB(int height){
	    if (height <= 0){
	        return;
	    }
 
	    printTriangleB(height-1);
	    printLine(height);
    }
 
    public static void main(String[] args){
	    printTriangleB(4);
    }
}

Y lo que muestra en pantalla es
*
**
***
****

Alguien me explica como hace? Porque para mi tendría que mostrar el triangulo al revés, así:
****
***
**
*

Muchas gracias!
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 Alejandro
Val: 77
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Necesito ayuda con este pedazo de código recursivo

Publicado por Alejandro (15 intervenciones) el 03/10/2019 17:21:12
Para entenderlo necesitas comprender el flujo del programa y la pila de llamadas.

Primero llamas a printTriangleB(4); que en su interior llama a printTriangleB(height-1); y una vez finalizada la instrucción se ejecuta la siguiente linea printLine(height); entonces la pila de llamadas va quedando asi:
1
2
3
4
5
6
7
8
9
10
11
printTriangleB(4);
   printTriangleB(3);
      printTriangleB(2);
         printTriangleB(1);
            printTriangleB(0);
               // Aquí se cumple la condición if (height <= 0)  terminando la recursividad, no hay mas llamadas a printTriangleB()
               // Regresa el control del flujo a la instrucción siguiente de de printTriangleB(0); que es printLine(1); y así sucesivamente.
         printLine(1);
      printLine(2);
   printLine(3);
printLine(4);

Así pues las llamadas a prinLine() se ejecutan del mas interno al mas externo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 8
Ha disminuido su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Necesito ayuda con este pedazo de código recursivo

Publicado por Mati (3 intervenciones) el 03/10/2019 18:58:31
Hola Alejandro. Mil gracias por tu respuesta, necesitaba exactamente eso.
Ahora otra duda con respecto a esa secuencia porque sigo sin entenderla, luego de que se ejecuta printTriangleB(0); y se ejecuta el return; por que empieza a ejecutarse printLine(1); despues printLine(2); y demas? Donde dice el código que se tiene que ejecutar al revés? Ahí creo que radica la mayor de mis dudas.
Gracias!
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
Imágen de perfil de Alejandro
Val: 77
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Necesito ayuda con este pedazo de código recursivo

Publicado por Alejandro (15 intervenciones) el 03/10/2019 20:31:45
Veo que no entendiste nada ¬_¬ en ningún momento se ejecuta al revés.
En la pila de llamadas el ultimo en entrar es el primero en salir.

1
2
printTriangleB(height-1);
printLine(height);
Para que se ejecute printLine(height) primero debe terminar la ejecución de printTriangleB(height-1) pero dentro de printTriangleB se vuelve a llamar a printTriangleB...

Si traduces el programa a secuencias el resultado es el siguiente
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// printTriangleB(4);
if (4 > 0){
	// printTriangleB(height-1);
	if (3 > 0){
		// printTriangleB(height-1);
		if (2 > 0){
			// printTriangleB(height-1);
			if (1 > 0){
				// printTriangleB(height-1);
				if (0 > 0){
					// Estas lineas y no se ejecutan
					printTriangleB(height-1);
					printLine(0);
				} // Finaliza printTriangleB(0);
				printLine(1);
			} // Finaliza printTriangleB(1);
			printLine(2);
		} // Finaliza printTriangleB(2);
		printLine(3);
	} // Finaliza printTriangleB(3);
	printLine(4);
} // Finaliza printTriangleB(4);
Cambie la condición para hacer el ejemplo mas sencillo
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
sin imagen de perfil
Val: 8
Ha disminuido su posición en 4 puestos en Java (en relación al último mes)
Gráfica de Java

Necesito ayuda con este pedazo de código recursivo

Publicado por Mati (3 intervenciones) el 03/10/2019 21:34:15
Ya entendí! Lo que no sabia es que Java te deja "en memoria" las operaciones pendientes y una vez que terminaba con una cosa ejecutaba todas las restantes en orden ultima --> primera. Es así, no?
Muchas gracias por tomarte el tiempo de responder de esa forma.
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