Java - ¿Cómo hacer esta figura de forma recursiva?

 
Vista:

¿Cómo hacer esta figura de forma recursiva?

Publicado por Ignacio Juan (3 intervenciones) el 10/11/2021 11:35:32
Se me pide hacer esta figura de manera recursiva:
1
2
3
4
5
*****
*  *
* *
**
*
(Triángulo rectángulo al revés)
De forma iterativa es fácil hacerla pero de forma recursiva no se me ocurre de ninguna forma. ¿Alguien me podría ayudar?
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

¿Cómo hacer esta figura de forma recursiva?

Publicado por Kabuto (1381 intervenciones) el 10/11/2021 20:48:56
Pues no se si he dado con la solución más óptima, pero funcionar funciona...

Puesto que el rectángulo va a ocupar 5 líneas, el parámetro a pasar de forma recursiva sería un int que represente el número de línea, que necesariamente ha de comenzar por 1

Según el valor de este int, retornaremos el String correspondiente a esa línea, más una llamada recursiva incrementando el int para pasar a la siguiente línea.

Con un switch se gestiona fácilmente y además podemos hacer que no importe el valor del int que se le pase inicialmente, con la opción default nos vamos a asegurar de que la serie siempre comenzará con valor 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Main
{
    public static void main(String[] args) {
 
      System.out.println(triangRecursivo(45));//Funciona igual con cualquier entero que le pasemos
 
    }
 
    static String triangRecursivo(int linea) {
        switch(linea) {
            case 1:
                return "*****\n" + triangRecursivo(++linea);
            case 2:
                return "*  *\n" + triangRecursivo(++linea);
            case 3:
                return "* *\n" + triangRecursivo(++linea);
            case 4:
                return "**\n" + triangRecursivo(++linea);
            case 5:
                return "*";
            default: //Forzamos ha comenzar la serie con valor 1
                return triangRecursivo(1);
        }
    }
}
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

¿Cómo hacer esta figura de forma recursiva?

Publicado por Ignacio Juan (3 intervenciones) el 10/11/2021 22:35:56
Esa forma está muy bien pero supones que el triángulo siempre tendrá 5 líneas, si tuviera n líneas (que el usuario estipulara la cantidad de líneas), ¿cómo sería?
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

¿Cómo hacer esta figura de forma recursiva?

Publicado por Tom (1831 intervenciones) el 11/11/2021 12:52:00
¿ No crees que eso ya deberías hacerlo tú mismo ?
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

¿Cómo hacer esta figura de forma recursiva?

Publicado por Ignacio Juan (3 intervenciones) el 11/11/2021 13:02:15
Estaría muy bien hacerlo por mi mismo si supiera hacerlo y si supiera hacerlo no estaría preguntando por aquí...
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
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

¿Cómo hacer esta figura de forma recursiva?

Publicado por Kabuto (1381 intervenciones) el 11/11/2021 20:33:36
OK.
Otra solución pues....

Si nos fijamos, la cantidad de estrellas de la primera línea, coincide con la cantidad de líneas que tendrá el triángulo.
Así que iniciamos la función recursiva con la cantidad de estrellas (o de líneas) que queremos y en cada llamada recursiva creamos una línea con la cantidad de estrellas indicada.
Y volvemos a llamar restando una estrella (o línea).

¿Problema?
Solo la primera línea está compuesta completamente de estrellas. Las demás están "huecas", sin relleno.
¿Cómo saber si queremos una línea rellena o "hueca".

Solo se me ocurre pasar un boolean en cada llamada recursiva. En la primera llamada ha de tener valor true, en las siguientes se pasará valor false.
Así la primera estará rellena y las demás no.

Cuando la cantidad de estrellas sea 1, es que es la última línea, así que devolvemos una estrella y se pone fin a las llamadas recursivas.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class Triangulo {
 
	public static void main(String[] args) {
		System.out.println(triangRecursivo(10, true));
 
	}
 
	private static String triangRecursivo(int estrellas, boolean relleno) {
 
		if (estrellas <= 1)
			return "*"; //Vértice final
		else {
 
			if (relleno) { //Solo la primera linea de estrellas tendrá relleno
				StringBuilder linea = new StringBuilder();
				for (int i = 0; i < estrellas; i++)
					linea.append("*");
 
				linea.append("\n");//Línea terminada
 
				return linea.toString() + triangRecursivo(estrellas - 1, false);
			}
			else { //Líneas sin relleno
				StringBuilder linea = new StringBuilder("*");//Estrella inicial
				//Ahora solo metemos espacios en blanco
				for (int i = 1; i < estrellas - 1; i++)
					linea.append(" ");
 
				linea.append("*\n");//Línea terminada con estrella final
 
				return linea.toString() + triangRecursivo(estrellas - 1, false);
			}
 
		}
	}
 
}

Y así se puede elegir el tamaño del triángulo:
1
2
3
4
5
6
7
8
9
10
**********
*       *
*      *
*     *
*    *
*   *
*  *
* *
**
*
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