Problema 3 · Programació II UDL 2010
Tema: Recursión: diseño, traza y diagramas de llamadas · Del examen Examen Primer Parcial Noviembre 2010 (2010)
Enunciado
Problema 3. Búsqueda binaria recursiva de coincidencia en vectores ordenados
Dados dos vectores de enteros con la misma longitud, donde uno está ordenado de manera creciente ( asc) y el otro de forma decreciente ( desc), se desea diseñar un método que determine si existe algún índice en el que ambos vectores contengan el mismo valor (por ejemplo, que exista una posición 3 tal que asc[3] == desc[3]).
La signatura del método principal es:
public boolean crossed(int[] asc, int[] desc)
Para conseguir una implementación eficiente aplicando la estrategia de búsqueda binaria, empleamos dos índices para acotar el rango de búsqueda en cada paso:
public boolean crossed(int[] asc, int[] desc, int left, int right)
a.
Diseñar la función recursiva crossed(int[] asc, int[] desc, int left, int right), justificando la validez del descarte de mitades apoyándose en las propiedades de ordenación de los vectores.
public boolean crossed(int[] asc, int[] desc, int left, int right) {
}
b.
Definir la invocación inicial desde crossed(int[] asc, int[] desc) para abarcar ambos vectores al completo.
public boolean crossed(int[] asc, int[] desc) {
}

Solución
Según los criterios oficiales de corrección
a. Justificación conceptual del descarte de mitades en crossed(int[] asc, int[] desc, int left, int right)
Solución: Definimos la función de diferencia para cada índice : . Dado que es monótonamente creciente () y es monótonamente decreciente (), la función es monótona estrictamente no decreciente: si , entonces . Buscamos si existe un índice donde . En cada paso calculamos : - Si : se ha encontrado el índice, retornamos true. - Si (): para cualquier se cumple , por lo que nunca podrá cumplirse la igualdad; descartamos la mitad izquierda y buscamos recursivamente en la derecha (, ). - Si (): para cualquier se cumple ; descartamos la mitad derecha y buscamos en la izquierda (, ). - Caso base de parada: si , el intervalo se ha vaciado sin coincidencia, retornamos false.
a. Implementación en Java de la función recursiva crossed(int[] asc, int[] desc, int left, int right)
Solución: ```java if (left > right) { return false; } int mid = (left + right) / 2; if (asc[mid] == desc[mid]) { return true; } else if (asc[mid] < desc[mid]) { return crossed(asc, desc, mid + 1, right); } else { return crossed(asc, desc, left, mid - 1); } ```
b. Definir la invocación inicial desde crossed(int[] asc, int[] desc) para abarcar ambos vectores al completo.
Solución: ```java return crossed(asc, desc, 0, asc.length - 1); ```
La explicación paso a paso, hecha con IA, es Premium. Premium
Resuélvelo aquí mismo: corrección automática, pistas y solución paso a paso.
‹ Problema 2 · 2010 · Ejercicio Recuperación - Problema 1. Distancia de Manhattan… · 2010 ›