eje 9 otra solucion

eje 9 otra solucion

de Martin Aguilera Cabrera -
Número de respuestas: 5
  1. Buenas quisiera saber si esto esta bien, pq anda bien la ejecución, pero es distinto a la solución que ustedes realizaron.
Adjunto Screenshot from 2020-03-28 20-42-31.png
En respuesta a Martin Aguilera Cabrera

Re: eje 9 otra solucion

de Fernando Fernandez -
Sí, esta solución está bien (de hecho, en el grabación modificamos levemente la descripción del problema para no poder usarla; ahora lo vemos).
Hay otras soluciones, una se menciona al final del pdf con las soluciones y la íbamos a desarrollar en la grabación pero ya estaba quedando muy larga.

Un par de detalles sobre esta solución. No haría falta controlar V[inf], porque las precondiciones aseguran que en inf hay un vaso lleno y en sup uno vacío.
Como consecuencia no hace falta la variable auxiliar, o sea, no hace falta usar un tercer vaso para el intercambio. El otro detalle es que la otra solución, aunque no era el objetivo, resultó ser más eficiente porque hace la mitad de las llamadas y no necesita controlar si inf es par.

La modificación que mencioné que se hizo en la grabación es que en la letra pide que los vasos queden alternados con los vasos llenos en las posiciones impares. Y esto es lo que vos resolvés. Generalizás el problema original con parámetro n a otro con parámetros inf y sup y mantenés la descripción: vasos alternados con los llenos en las posiciones impares.

Para mostrar que a veces hacer la transformación más chica posible (en este caso inf +1, sup - 1) no siempre sirve modificamos la descripción diciendo que queremos vasos alternados con el primero lleno, lo cual era lo mismo para el problema inicial (segmento desde 1 hasta n). Al generalizarlo mantuvimos la misma descripción y ahí fue donde apareció la dificultad: la solución obtenida no sirve cuando inf es par. Como consecuencia la transformación pasó a ser inf + 2, sup - 2.



En respuesta a Fernando Fernandez

Re: eje 9 otra solucion

de Maria Alejandra Galetta Paz -

Buenas tardes, a mi la solución me quedo ligeramente distinta es correcto realizarla de la siguiente forma?

void vasosRec ( bool * V, uint inf , uint sup ) {

if ( sup >inf ) {

V[ inf ] = false ;

V[ sup ] = true ;

vasosRec (V, inf + 2, sup - 2);

}

}

void vasos ( bool * V, uint n) { vasosRec (V, 2, n-1); }

La llamada la empece en el vaso 2 ya que no tendría que hacer cambios en el vaso 1, y por la misma razón el valor superior lo tomé como n-1.

Si n fuera 2, entonces en mi caso entiendo que no se ejecutaría nada ya que sup sería inferior a inf. 

No sé si es correcto mi razonamiento, me quedó la misma duda al ver el video y la soluciones. 

Muchas gracias

En respuesta a Maria Alejandra Galetta Paz

Re: eje 9 otra solucion

de Facundo Benavides -

hola,

la condición del if no es correcta. fijate que para cualquier n > 2, con n%2=0, cuando invocás a vasosRec la primera vez con n-1 (impar) y en todos los casos entrarías al if, lo cual es incorrecto.

en las llamadas recursivas no tendrías ese problema porque invocás achicando el dominio 4 posiciones y por lo tanto se invoca con n par.

saludos

En respuesta a Facundo Benavides

Re: eje 9 otra solucion

de Maria Alejandra Galetta Paz -

Muchas gracias por tu respuesta, de todos modos no me quedó claro en qué casos sería incorrecto entrar al if con la primera llamada. Entiendo que si los vasos son pares la primer llamada me quedaría, con inf=2 (ya que lo definí así en la función) y el sup=7(si n fuera 8, siendo siempre impar si n es par) y ahí si tendría que entrar al if para cambiarlos. Y en la última llamada recursiva luego de cambiar los vasos del medio, ya no entra en el if porque el valor inferior supera al superior.

Estuve pensando y no logro darme cuenta con que valores que cumplan las precondiciones estaría siendo incorrecto entrar en el primer if.

Muchas gracias