Examen de Programació II UDL 2011 · Primer Parcial (Curso 2011/2012)
Examen de Programació II de la UDL (Grado en Ingeniería Informática) 2011, Primer Parcial (Curso 2011/2012): 3 problemas con solución. Gratis.
Temas del examen: Recursión: diseño, traza y diagramas de llamadas
Problema 1 · Recursión: diseño, traza y diagramas de llamadas
Dado el siguiente programa Java, elabore el diagrama con todas las llamadas que se ejecutan, indicando para cada una de ellas:
Nombre de la función ejecutada.
Variables locales y parámetros con sus valores correspondientes (utilice ? cuando se encuentren aún sin inicializar, e indique las actualizaciones tras cada asignación). En métodos del sistema como println, use param como nombre del parámetro.
Puntos de retorno señalando el número de línea.
Indique de forma explícita el texto final que se imprime en pantalla.
1 public class MisteryProgram extends ConsoleProgram {
2
3 public int isMisterious(int[] coefs, int initial, int pos) {
4 if (pos == coefs.length) {
5 return 0;
6 } else {
7 int value = isMisterious(coefs, initial, pos+1);
8 return coefs[pos] + initial * value;
9 }
10 }
11
12 public int isMisterious(int[] elems, int first) {
13 return isMisterious(elems, first, 0);
14 }
15
16 public void run() {
17 int[] poly = {4, 3, 2, 1};
18 int at = 5;
19 int eval = isMisterious(poly, at);
20 println("El resultado es " + eval);
21 }
22 }
Problema 2 · Recursión: diseño, traza y diagramas de llamadas
Problema 2. Función recursiva numberOfDigits
Diseñe e implemente una función recursiva que reciba un número natural (entero mayor o igual que cero) y devuelva el número total de dígitos que posee. Por ejemplo: 0 tiene 1 dígito; 23 tiene 2 dígitos; 2430 tiene 4 dígitos.
public int numberOfDigits(int n) {
// ?
}
Nota: Es obligatoria la justificación del diseño (mediante casos base, hipótesis inductiva o razonamiento matemático/gráfico); el código sin justificar no se considerará válido.
public int numberOfDigits(int n) {
}
Problema 3 · Recursión: diseño, traza y diagramas de llamadas
Problema 3. Comprobación recursiva de prefijo entre dos cadenas
Diseñe e implemente una función que determine si una primera cadena es prefijo de una segunda cadena. Por ejemplo:
"pata" es prefijo de "patata" (verdadero).
"pato" no es prefijo de "patata" (falso).
"pasota" no es prefijo de "paso" (falso).
"" es prefijo de "palote" (verdadero).
public boolean isPrefix(String prefix, String word) {
// ?
}
Pistas:
Para aplicar recursividad sin generar nuevos objetos de cadena en cada iteración, emplee una función auxiliar con un parámetro adicional que señale el índice actual que se compara.
Puede acceder a las posiciones con str.charAt(i).
Nota: Justifique adecuadamente el diseño recursivo (casos base y avance inductivo).
También puedes estudiar por temas
Practica un tema con ejercicios de los exámenes de todos los años, mezclados.
- Diseño de clases y objetos en Java, herencia e igualdad · 7 problemas · 35 % de que salga
- Recursión: diseño, traza y diagramas de llamadas · 10 problemas · 25 % de que salga
- Ficheros en Java: texto secuencial y acceso directo binario · 5 problemas · 25 % de que salga
- Árboles binarios y heaps · 2 problemas · 40 % de que salga
- Tablas hash · 1 problema · 40 % de que salga
- Listas en Java: uso de la API, implementación enlazada y coste · 3 problemas · 35 % de que salga