Problema 3 · Programació II UDL 2012

Tema: Recursión: diseño, traza y diagramas de llamadas · Del examen Examen Primer Parcial Curso 2012-2013 (2012)

Enunciado

Problema 3. Copia recursiva de vector mediante prefijos

Diseñad e implementad un método recursivo que, dado un vector de enteros no nulo, cree y devuelva un nuevo vector idéntico (con idéntica dimensión y los mismos valores situados en idénticas posiciones).

public int[] copyVector(int[] source) {

// Implementación

}

Para evitar la sobrecarga de instanciar y replicar vectores en cada nivel de recursión, debéis apoyar la solución en una función auxiliar con parámetros adicionales que opere estructurándose sobre los prefijos de los vectores.

Nota: Se requiere justificar detalladamente el diseño inductivo o recursivo.

Enunciado: Problema 3 · Programació II UDL 2012

Solución

Según los criterios oficiales de corrección

1. Justificación formal del diseño inductivo o recursivo

Solución: Un prefijo de longitud kk abarca los elementos con índices de 00 a k−1k - 1. Para copiar eficientemente un vector de tamaño N=source.lengthN = \text{source.length}, reservamos previamente en la función principal un único array destino target de longitud NN y delegamos la copia en una función auxiliar parametrizada por la longitud del prefijo pendiente de copiar: - Caso base: Para un prefijo de longitud k=0k = 0, no queda ningún elemento por transferir; la función no realiza ninguna acción. - Paso inductivo: Para copiar un prefijo de longitud k>0k > 0 (índices 00 a k−1k - 1): 1. Se copia el elemento extremo de dicho prefijo: `target[k - 1] = source[k - 1]`. 2. Por hipótesis inductiva, la llamada recursiva reduce la tarea a copiar el prefijo restante de longitud k−1k - 1 (índices 00 a k−2k - 2). Dado que kk decrece estrictamente en una unidad en cada invocación, se alcanza de forma segura el caso base k=0k = 0.

2. Código de la solución

Solución: ```java public int[] copyVector(int[] source) { int[] target = new int[source.length]; copyPrefix(source, target, source.length); return target; } private void copyPrefix(int[] source, int[] target, int prefixLength) { if (prefixLength > 0) { target[prefixLength - 1] = source[prefixLength - 1]; copyPrefix(source, target, prefixLength - 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 · 2012 · Problema 1 · 2011 ›

Más ejercicios de Recursión: diseño, traza y diagramas de llamadas