1. Objetivos, nivel y requisitos previos
- Definir las entradas permitidas y la salida exigida de un algoritmo.
- Trazar una búsqueda del máximo con una variable, una condición y un bucle.
- Justificar la corrección y la terminación, y después distinguir demostración y pruebas.
Un algoritmo describe un método preciso para transformar datos de entrada en un resultado. Aquí estudiamos algoritmos deterministas que deben terminar para toda entrada permitida. Un programa expresa uno de estos métodos en un lenguaje que una máquina puede ejecutar; un mismo método puede tener varios programas.
Al finalizar esta introducción, podrá precisar las entradas y la salida esperada, seguir los valores de una variable y justificar por qué una búsqueda del máximo termina y da el resultado correcto. Esta competencia sirve para comprobar un procedimiento en vez de confiar en una salida plausible.
Nivel: principiante. Basta con comparar números enteros y leer una secuencia ordenada de valores, llamada aquí lista. Se permiten los números negativos. No se requiere ningún lenguaje de programación: empiece en papel. El paso al código es una aplicación, no un requisito previo oculto.
2. Definir el problema antes que el método
Buscamos el mayor valor de una lista finita no vacía de enteros. La entrada puede contener repeticiones y no tiene que estar ordenada. La salida es un valor, no su posición ni el número de veces que aparece. Para [3, 7, 7, 2], el resultado esperado es 7.
La condición «no vacía» es una precondición: precisa las entradas permitidas. La postcondición expresa el resultado exigido: la salida pertenece a la lista y es mayor o igual que cada uno de sus valores. En una lista vacía, no existe ningún máximo que devolver. Un procedimiento destinado a aceptar también este caso debería definir explícitamente un error u otro resultado; no debería inventar un cero.
3. Construir un procedimiento sin ambigüedad
Mantenga un candidato llamado best. Inicialícelo con el primer valor y recorra después los demás en su orden. Si el valor examinado es estrictamente mayor que best, sustituya best por ese valor. En caso contrario, consérvelo. Después del último valor, devuelva best.
La asignación cambia un valor almacenado: best ← x significa «guardar el valor actual de x en best». No es una ecuación válida para siempre. Una condición elige la acción; un bucle repite los pasos para los valores restantes. El orden, la inicialización y la condición forman parte del método tanto como el resultado final.
best ← primer valor de la lista
para cada valor x después del primero:
si x > best:
best ← x
devolver best
Este texto es pseudocódigo: describe el método sin imponer la sintaxis de un lenguaje. No debe pegarse tal cual en un intérprete de Python.

Ilustración generada con ayuda de inteligencia artificial. Sugiere el papel de la memoria; la traza numérica exacta y su justificación se presentan en el texto y la tabla.
4. Seguir un ejemplo resuelto
Para [3, 7, 7, 2], la inicialización da best = 3. Quedan tres valores por comparar.
| Valor examinado | best antes | ¿x > best? | best después |
|---|---|---|---|
| 7 | 3 | sí | 7 |
| 7 | 7 | no | 7 |
| 2 | 7 | no | 7 |
La segunda aparición de 7 no cambia el valor del máximo. El resultado es 7 después de exactamente tres comparaciones. Con un solo valor, el bucle no se ejecuta y se devuelve ese valor. Contar las comparaciones no es medir el tiempo real de ejecución: este depende también del programa y de la máquina.
5. Justificar la corrección y la terminación
Después de cada paso, best es el máximo de la parte ya recorrida. Esta propiedad que se conserva se llama invariante. Es verdadera al principio, porque la parte recorrida solo contiene el primer valor. Si el valor siguiente es mayor, sustituir el candidato conserva la propiedad; en caso contrario, conservar el candidato también la mantiene. Al final, la parte recorrida es toda la lista: por tanto, se satisface la postcondición.
Una lista finita de n valores deja n − 1 valores después del primero. Cada paso procesa uno, sin retroceder: el número restante disminuye hasta cero. Esto justifica la terminación y n − 1 comparaciones, aunque todos los valores sean iguales. Las pruebas con ejemplos pueden revelar un error; no sustituyen esta justificación para todas las entradas permitidas.
6. Traducir a un programa Python
Esta es una traducción para una lista no vacía de enteros. values[0] designa su primer valor; range(1, len(values)) recorre los índices posteriores. La sangría delimita el bucle y la condición.
def maximum(values):
best = values[0]
for i in range(1, len(values)):
x = values[i]
if x > best:
best = x
return best
Esta función supone que se cumple la precondición. No constituye una interfaz completa de validación de entradas: la lista vacía provoca un error al acceder a values[0]. Los valores ausentes, las mezclas de tipos y las listas infinitas quedan fuera del problema definido. Antes de reutilizarla, precise el contrato y el tratamiento de las entradas rechazadas. El código busca facilitar la comprensión del método; en la práctica, puede ser preferible una función integrada de máximo.
7. Ejercicio guiado
Trazar una búsqueda del máximo
Para [5, 1, 9, 3], ejecute el procedimiento a mano. Construya una tabla con el valor examinado, best antes y best después; indique la salida y el número de comparaciones.
Criterio de éxito : La traza inicializa best con el primer valor, examina cada uno de los demás valores una vez y explica la decisión en cada comparación.
Solución guiada, para consultar después de su intento: el candidato empieza en 5; después de 1, 9 y 3, vale sucesivamente 5, 9 y 9. Tres comparaciones llevan a la salida 9. Cada fila debe mostrar el valor examinado, el candidato antes y el candidato después; una salida correcta por sí sola no basta para explicar el razonamiento.
8. Proyecto proporcionado
Especificar y probar un procedimiento
Para [12, 8, 15, 15, 4], redacte la precondición y la postcondición, trace el máximo y justifique la terminación. Añada las pruebas [-4, -2, -9], [6] y [3, 3]. Explique el tratamiento previsto para una lista vacía y por qué es peligroso inicializar a cero.
Criterio de éxito : El entregable contiene un contrato explícito, las cuatro trazas, un argumento del invariante y una justificación de la terminación. Distingue las entradas permitidas del caso vacío rechazado.
Trabaje primero en papel. Si utiliza después el programa, compare su salida con su traza. La coincidencia en estos pocos casos es una comprobación limitada; conserve también el argumento del invariante y la justificación de la terminación. El entregable es una pequeña especificación acompañada de las trazas y las pruebas, sin recoger datos personales.
9. Evaluación de transferencia
Transferir el método a un mínimo
Adapte el procedimiento para buscar el mínimo de una lista finita no vacía de enteros. Dé el pseudocódigo, trace [6, -1, 4, -1] y explique la propiedad que se conserva y la terminación. Encuentre un contraejemplo de la inicialización a cero y después precise por qué una lista vacía sigue fuera del contrato.
Criterio de éxito : El método funciona en todo el dominio anunciado, trata las repeticiones y el caso de un solo elemento, separa prueba y demostración, y justifica la inicialización, la comparación y la terminación sin repetir una regla memorizada sin explicación.
Redacte su justificación sin apuntes, explicando cada elección. Compare después su método con la búsqueda del máximo: ¿qué pasos se mantienen y qué decisión cambia?
10. Límites y errores frecuentes
Inicializar best a cero parece funcionar para algunas listas de valores positivos, pero falla con [-4, -2, -9]: el programa devuelve entonces 0, que ni siquiera pertenece a la entrada. Inicializar con el primer valor evita esta hipótesis oculta. Una lista de un solo elemento y las repeticiones son casos permitidos, no anomalías.
El máximo de una lista no es su suma ni un valor que necesariamente aparezca una sola vez en la lista. Un algoritmo puede ser correcto sin ser el único posible. Otro método podría ordenar antes de elegir el último elemento, pero eso añade un trabajo innecesario para esta única pregunta. Esta unidad no demuestra que un procedimiento cualquiera termine ni que un programa cualquiera respete su método: estas dos propiedades requieren sus propios argumentos.
11. Síntesis, recuerdo activo y siguiente paso
El procedimiento es: definir el contrato, elegir un método, trazar un caso, justificar la propiedad que se conserva y la terminación, y después comprobar la traducción. Una salida plausible no es una demostración general. Retome mañana, sin releer, estas cuatro preguntas:
- ¿Qué diferencia establece entre un algoritmo y un programa?
- Para [2, 5, 4], ¿qué valores toma el candidato y cuántas comparaciones se hacen?
- ¿Por qué falla la inicialización a cero para algunas entradas?
- Explique a un principiante por qué el procedimiento termina en toda lista finita no vacía.
Referencia breve: el método es distinto de su traducción; la traza empieza en 2, pasa a 5 y después se mantiene en 5, con dos comparaciones. El cero impone indebidamente un límite inferior a los valores. El número de elementos que quedan por procesar disminuye de uno en uno hasta cero.
Siguiente paso propuesto: comparar la búsqueda de un valor en una lista con la búsqueda de su máximo. Todavía no se ha designado ningún curso siguiente: esta raíz permanece abierta a una ampliación del itinerario formativo, después de la calificación del grafo.
12. Fuentes y método editorial
Esta unidad original relaciona dos programas institucionales independientes: el programa francés de numérique et sciences informatiques, première, BO del 22 de enero de 2019, anexo p. 8 «Langages et programmation» y p. 9 «Algorithmique», y el programa inglés de computing, 2013, «Key stage 2» y «Key stage 3». Fuentes releídas el 12 de octubre de 2026. La correspondencia se refiere a especificación, secuencia, selección, repetición, pruebas y justificación; no certifica la cobertura íntegra de estos programas.
El texto, los ejemplos y las actividades se prepararon con asistencia de inteligencia artificial. Las trazas y los casos de cálculo deben comprobarse, al igual que las ocho versiones lingüísticas, antes de la entrega pública. No se afirma ninguna mejora del aprendizaje ni revisión humana.