Problema 2 · Programació II UDL 2010

Tema: Recursión: diseño, traza y diagramas de llamadas · Del examen Examen Primer Parcial Noviembre 2010 (2010)

Enunciado

Problema 2. Suma recursiva de diferencias cuadráticas

Dados dos vectores de números en coma flotante ( double) de igual tamaño, se desea implementar un método que obtenga la suma posicional de las diferencias al cuadrado entre sus componentes:

sumOfSquaredDiffs(a,b)=∑i=0n−1(ai−bi)2\text{sumOfSquaredDiffs}(a, b) = \sum_{i=0}^{n-1} (a_i - b_i)^2

En Java el método envoltorio presenta la siguiente signatura:

public double sumOfSquaredDiffs(double[] a, double[] b) {

//...

}

Para implementar la solución de forma recursiva, se añade un parámetro adicional que señale el índice sobre el que se opera:

public double squaredDiffs(double[] a, double[] b, int pos) {

//...

}

Se pide:

a)

Diseñar la función recursiva squaredDiffs razonando y justificando su funcionamiento correcto (caso base, caso recursivo y convergencia).

public double squaredDiffs(double[] a, double[] b, int pos) {

}

b)

Indicar la llamada inicial que efectúa el método envoltorio sumOfSquaredDiffs para computar el total sobre todos los elementos de los vectores.

public double sumOfSquaredDiffs(double[] a, double[] b) {

}

Enunciado: Problema 2 · Programació II UDL 2010

Solución

Según los criterios oficiales de corrección

a. Diseñar la función recursiva squaredDiffs razonando y justificando su funcionamiento correcto (caso base, caso recursivo y convergencia).

Solución: Esquema conceptual: Recorremos los vectores desde el índice pos hasta el final (a.length). En cada llamada procesamos la posición actual (a[pos] - b[pos])^2 y le sumamos el resultado de procesar recursivamente el resto del array a partir de pos + 1. - Caso base: Cuando pos == a.length, hemos llegado al final del vector (o los vectores están vacíos). No quedan elementos por sumar, por lo que se retorna 0.0. - Caso recursivo: Cuando pos < a.length, se calcula la diferencia al cuadrado en la posición pos y se suma la llamada con pos + 1: (a[pos] - b[pos])^2 + squaredDiffs(a, b, pos + 1). - Terminación: En cada invocación el índice pos se incrementa en 1, con lo que la distancia a.length - pos decrece estrictamente hasta alcanzar el caso base pos == a.length.

a. Implementación en Java de la función recursiva squaredDiffs:

Solución: ```java if (pos == a.length) { return 0.0; } else { double diff = a[pos] - b[pos]; return (diff * diff) + squaredDiffs(a, b, pos + 1); } ```

b. Indicar la llamada inicial que efectúa el método envoltorio sumOfSquaredDiffs para computar el total sobre todos los elementos de los vectores.

Solución: ```java return squaredDiffs(a, b, 0); ```

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 1 · 2010 · Problema 3 · 2010 ›

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