Una posible solución al desafío: las dos últimas invocaciones retornaban un resultado incorrecto con la versión errónea del algoritmo. En la versión corregida dada en la solución, las cuatro invocaciones retornan lo esperado.
En este caso, debemos generar casos de prueba para un algoritmo y corregirlo.
No debemos confiarnos si un algoritmo funciona como esperamos en los casos más “obvios”: es necesario hacer varias pruebas para mejorarlo todo lo posible.
La respuesta correcta es la c. ✏️ Explicación: Los arreglos en Java son alocados dinámicamente (son objetos). Por ende, cuando asignamos un arreglo a otro no se está realizando una copia sino que ambas variables referencian al mismo objeto. Al modificar un elemento de la variable m1, se altera la única instancia del arreglo que existe, la cual puede referenciarse como m1 o m2 indistintamente.
Entre las muchas y muy complejas tareas de un compilador está la de optimizar código para lograr mayor eficiencia consumiendo menos recursos. Acá, algunos resumidos ejemplos.
Cuando comenzamos a programar, normalmente usamos siempre la búsqueda secuencial. Pero existen otros algoritmos. Uno de los más conocidos es la búsqueda binaria.
👉 Ejemplo: en un arreglo de 8 elementos, el caso promedio de búsqueda secuencial realiza 4 comparaciones, al igual que el peor caso de búsqueda binaria. Pero si el arreglo tiene 100000 elementos, el caso promedio de búsqueda secuencial hace 50000 comparaciones mientras que el peor caso de la búsqueda binaria hace 18 😮
Podemos verificar si un algoritmo es válido utilizando la “lógica de Hoare”, desarrollada por el británico Tony Hoare, quien también es el creador del algoritmo “quicksort” 🙀
🤓 ¿Sabías que los romanos no siempre usaron las mismas reglas para escribir sus números y que éstas varían según la época? De acuerdo a las reglas modernas, esta expresión regular comprueba la validez de un número romano: