Java - Recursion

 
Vista:

Recursion

Publicado por Cristhian (2 intervenciones) el 01/10/2022 14:55:58
Muy buenos días, quería pedirles su apoyo para resolver esto, no le entiendo al planteamiento
Evaluar si una expresión matemática está escrita de forma correcta de forma recursiva ( no usará pilas, ni expresiones regulares)

considerando solo paréntesis () y corchetes []

por ejemplo la expresión

(3+4)/ [3+(4-3)] es correcta

(3+4)/ [3+4-3)] no es correcta, porque después de del tercer tres hay un ), e cual nunca se abrió
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

Recursion

Publicado por Kabuto (1381 intervenciones) el 02/10/2022 13:23:09
Ejercicio interesante.

No se si habrá una solución más óptima que la que yo he podido idear.
En ella, lo que hago es pasar como argumentos de la función recursiva la cadena que analizamos, un int que indica la posición del carácter que se va a revisar en esta llamada recursiva, y dos boolean.
Estos boolean son los que indican en cada momento si actualmente hay un paréntesis o un corchete abierto (true) o si están cerrados(false)

Así, si encontramos un corchete abierto, y el boolean asociado a los corchetes tiene valor true, significa que hemos encontrado un corchete abierto sin que se hubiera cerrado el anterior, por lo tanto la expresión NO es correcta.

Lo explico un poco más a fondo en los comentarios del 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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
ublic class Expresion {
 
	public static void main(String[] args) {
 
		final String CORRECTA = "(3+4)/ [3+(4-3)] ";
		final String INCORRECTA = "(3+4)/ [3+4-3)]";
 
		System.out.println("La expresión: " + CORRECTA);
		System.out.println(checkExpresion(CORRECTA, 0, false, false)?"Es correcta":"Es incorrecta");
 
		System.out.println("\nLa expresión: " + INCORRECTA);
		System.out.println(checkExpresion(INCORRECTA, 0, false, false)?"Es correcta":"Es incorrecta");
 
	}
 
	/*
	 * Comprueba recursivamente si una expresion matemática es escrita correctamente
	 * según los paréntesis y corchetes que pueda contener.
	 * En cada llamada recursiva, se analizará un carácter de la expresión para detectar
	 * los paréntesis y corchetes y comprobar si el orden de apertura y cierre de estos
	 * es correcto.
	 * En cada llamada recursiva vamos a pasar 4 argumentos:
	 * - String expresion: La expresion que estamos comprobando.
	 * - int car: Posición del carácter que se analizará en cada llamada recursiva.
	 * - boolean paren: Indica si actualmente hay un paréntesis abierto(true) o cerrado(false)
	 * - boolean corch: Indica si actualmente hay un corchete abierto(true) o cerrado(false)
	 *
	 * Por ejemplo, si se encuentra un paréntesis abierto y su boolean correspondiente indica que
	 * YA estaba abierto, la expresión será incorrecta y se retornará false.
	 * En cambio, si el boolean indica que está cerrado, pues de momento la expresión es correcta.
	 * Así que el boolean pasará a true para indicar que ahora si hay un paréntesis abierto y se
	 * pasará a comprobar el siguiente carácter.
	 *
	 * Cuando ya se han comprobado todos los caracteres, es decir, si car == expresion.length()
	 * ya no se harán más llamadas recursivas.
	 * Llegados a este punto, la expresión solo se considerará correcta si los boolean paren y corch
	 * tienen valor false, es decir, que están cerrados y no ha quedado ninguno abierto.
	 */
	private static boolean checkExpresion(String expresion, int car, boolean paren, boolean corch) {
 
		if (car == expresion.length()) { //Todos caracteres revisados
			return !paren && !corch; //Será correcta si NO HAY parentesis ni corchetes abiertos
		}
		else { //Aún no hemos revisado todos los caracteres
			//Comprobamos caracter
			switch(expresion.charAt(car)) {
			case '(':
				//Si consta que ya hay abierto un paréntesis, la expresion está mal
				if (paren) //Ya está abierto
					return false; //Expresión errónea
				else //No consta paréntesis abierto
					paren = true; //Pues lo abrimos
				break;
			case ')':
				if (!paren) //Ya está cerrado
					return false; //Expresión errónea
				else //No consta paréntesis cerrado
					paren = false; //Pues lo cerramos
				break;
			case '[':
				if (corch)
					return false;
				else
					corch = true;
				break;
			case ']':
				if (!corch)
					return false;
				else
					corch = false;
			}
			//Switch ha terminado de evaluar caracter.
			//Hacemos llamada recursiva para evaluar el siguiente
			return checkExpresion(expresion , car+1, paren, corch);
		}
	}
 
}


Si probamos a ejecutarlo, parece funcionar correctamente:
1
2
3
4
5
La expresión: (3+4)/ [3+(4-3)]
Es correcta
 
La expresión: (3+4)/ [3+4-3)]
Es incorrecta


Cualquier duda, solo has de preguntar.
Saludos.
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