Laboratorio 2¶
Ejercicio 1: Validador de secuencia montaña¶
Una secuencia montaña es una lista de números enteros que cumple exactamente tres condiciones:
- Tiene al menos 3 números.
- Existe un pico: un número que es mayor a todos los anteriores y a todos los posteriores.
- Desde el inicio hasta el pico, los números son estrictamente crecientes (sin repetidos ni descensos).
- Desde el pico hasta el final, los números son estrictamente decrecientes (sin repetidos ni ascensos).
El programa debe cumplir con los siguientes requisitos:
- Usar un ciclo
while continuar(continuares una variable booleana) para capturar números enteros uno por uno. Ingresar0termina la captura. - Si el usuario ingresa algo que no sea un número entero, mostrar un error y usar
continuepara volver a pedir sin registrar nada. - Si se ingresaron menos de 3 números, mostrar un mensaje indicando que la secuencia no puede ser montaña.
- Usar un ciclo
forconbreakpara encontrar el pico: recorrer la secuencia mientras los valores suban. Cuando dejen de subir, detener conbreak. - Usar otro ciclo
forconbreakpara verificar la fase descendente desde el pico: si en algún punto los valores no bajan estrictamente, romper conbreak. - Al final, indicar si es o no es una secuencia montaña, y en caso afirmativo, indicar cuál es el valor del pico.
El 0 es centinela, no elemento
El 0 solo indica el fin de la captura. No debe incluirse en la secuencia.
Ejemplos de ejecución¶
Requisitos técnicos¶
- Usar
while continuarconbreakpara la captura de datos. - Usar
continuepara manejar entradas inválidas sin interrumpir el ciclo. - Usar
forconbreakpara la fase ascendente. - Usar
forconbreakpara la fase descendente. - No usar funciones propias de Python como
sorted()o comparaciones directas sobre toda la lista de una vez.
Rúbrica de evaluación¶
| Criterio | Puntaje |
|---|---|
Se usa while continuar + break para capturar la secuencia correctamente |
8 |
Se usa continue para ignorar entradas no numéricas sin detener el ciclo |
7 |
| Se detecta y reporta correctamente si hay menos de 3 elementos | 5 |
Se usa for + break para encontrar el pico (fase ascendente) |
10 |
| Se verifica correctamente que el pico no es el primero ni el último elemento | 5 |
Se usa for + break para validar la fase descendente |
10 |
| Se reporta correctamente si es montaña, indicando el valor del pico | 5 |
| Se reporta el motivo correcto cuando no es montaña | 5 |
El 0 no se incluye en la secuencia |
5 |
| Total | 60 |
Ejercicio 2: Análisis del algoritmo de Kadane¶
El algoritmo de Kadane resuelve el siguiente problema: dada una lista de números enteros (que puede incluir negativos), encontrar la mayor suma posible de un subgrupo de elementos consecutivos.
Por ejemplo, en la lista [-2, 1, -3, 4, -1, 2, 1, -5, 4], el subgrupo [4, -1, 2, 1] produce la mayor suma posible: 6.
A continuación se presenta una versión simplificada del algoritmo. No debe modificarlo. Su tarea es analizarlo y responder las preguntas planteadas.
n = int(input("¿Cuántos números? "))
numeros = []
for _ in range(n):
numeros.append(int(input("Número: ")))
actual = numeros[0]
mejor = numeros[0]
for i in range(1, len(numeros)):
if actual < 0:
actual = numeros[i]
else:
actual += numeros[i]
if actual > mejor:
mejor = actual
print(f"Mayor suma contigua: {mejor}")
Preguntas de análisis¶
Responda las siguientes preguntas en un archivo analisis.txt. El número de cada pregunta debe preceder su respuesta.
Puede ayudarse con búsquedas en Internet.
Pregunta 1: Variables iniciales
¿Qué representan actual y mejor al inicio del programa, antes de que comience el ciclo for? ¿Por qué se inicializan con numeros[0] y no con 0?
Pista
Piense qué ocurriría si todos los números de la lista fueran negativos y mejor comenzara en 0.
Pregunta 2: La decisión clave
La línea más importante del algoritmo es:
Explique con sus propias palabras qué decisión toma el algoritmo en ese punto y por qué tiene sentido descartar la suma acumulada cuando es negativa.
Pista
Si actual = -3 y el siguiente número es 5, ¿cuánto da -3 + 5? ¿Y cuánto da empezar directamente desde 5? ¿Cuál es mayor?
Pregunta 3: Caso extremo
¿Qué resultado produce el algoritmo con la lista [-5, -2, -8, -1, -4]? Justifique por qué ese es el resultado correcto y no 0.
Pregunta 4: Identificación del ciclo
¿Qué tipo de ciclo se usa para recorrer la lista y por qué tiene sentido usarlo aquí en lugar de un while?
Rúbrica de evaluación¶
| Criterio | Puntaje |
|---|---|
Pregunta 1: explica correctamente actual y mejor y justifica la inicialización con numeros[0] |
10 |
| Pregunta 2: explica correctamente la lógica de descartar la suma negativa | 10 |
Pregunta 3: identifica el resultado correcto y justifica por qué no es 0 |
10 |
Pregunta 4: justifica el uso de for correctamente |
10 |
| Total | 40 |