Pregunta 2.a-b · Prácticas de programación UOC 2023

Tema: Comprensión y traza de algoritmos recursivos · Del examen Examen de síntesis. Prácticas de programación (Enero 2023) (2023)

Enunciado

Pregunta 2 (50%). Análisis y desarrollo de método recursivo e iterativo

Se facilita el código siguiente escrito en lenguaje C correspondiente a una función denominada mystery. Cabe recordar que el operador de división / aplicado entre cantidades enteras calcula la división truncada (cociente entero):

void mystery (int x)

{

int res;

assert(x >= 0); // (1)

if (x >= 2) // (2)

res = 1 + mystery(x / 2); // (3)

else // (4)

res = 1; // (5)

return res; // (6)

} Nota: Aunque la firma original indica void, la rutina incluye sentencias return res; devolviendo un entero.

a)

[10%] Describe la labor computacional que efectúa mystery. Detalla adicionalmente el árbol o pila de llamadas paso a paso empleando un esquema gráfico de marcos/cajas con los parámetros y valores de retorno para la invocación:

mystery(25);

b)

[5%] Razona qué efecto provocaría sustituir la aserción de la línea (1) por la siguiente instrucción condicional:

if (x < 0) x = -x;

Enunciado: Pregunta 2.a-b · Prácticas de programación UOC 2023

Solución

Según los criterios oficiales de corrección

a. [10%] Describe la labor computacional que efectúa mystery . Detalla adicionalmente el árbol o pila de llamadas paso a paso empleando un esquema gráfico de marcos/cajas con los parámetros y valores de retorno para la invocación: mystery(25);

Solución: La función determina cuántas divisiones sucesivas por 2 admite el número antes de situarse por debajo de 2; esto equivale a calcular el número total de bits requeridos para representar el entero xx en base binaria (es decir, ⌊log⁡2(x)⌋+1\lfloor \log_2(x) \rfloor + 1 para x≥1x \ge 1, o 1 cuando x=0x = 0). Despliegue de llamadas y propagación de resultados al desapilar: - mystery(25)\mathrm{mystery}(25) invoca a mystery(12)\mathrm{mystery}(12) y calcula 1+4=51 + 4 = 5. - mystery(12)\mathrm{mystery}(12) invoca a mystery(6)\mathrm{mystery}(6) y calcula 1+3=41 + 3 = 4. - mystery(6)\mathrm{mystery}(6) invoca a mystery(3)\mathrm{mystery}(3) y calcula 1+2=31 + 2 = 3. - mystery(3)\mathrm{mystery}(3) invoca a mystery(1)\mathrm{mystery}(1) y calcula 1+1=21 + 1 = 2. - mystery(1)\mathrm{mystery}(1) alcanza el caso base (x<2x < 2) retornando directamente 1. Diagrama de activación de marcos:

b. [5%] Razona qué efecto provocaría sustituir la aserción de la línea (1) por la siguiente instrucción condicional: if (x < 0) x = -x;

Solución: Al reemplazar la comprobación de error por `if (x < 0) x = -x;`, los enteros negativos pasan a gestionarse transformándolos previamente en su valor absoluto positivo, impidiendo que el programa aborte con fallo de aserción. La función computará en esos casos la cantidad de dígitos binarios que corresponden al módulo o magnitud del valor de entrada.

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.

Pregunta 2.a - Comprensión y traza de algoritmos… · 2023 ›

Más ejercicios de Comprensión y traza de algoritmos recursivos