Soluciones para docentes

Algoritmos con estado

Recoge cuatro tipos de evidencia: predicción del estado relevante; comportamiento en casos variados, incluidos los límites; explicación apoyada en la traza y el estado; y corrección razonada de una discrepancia. Valora cada aspecto como inicial, con apoyo o autónomo, en papel o mediante el proceso aprobado del centro. Superar un reto demuestra un comportamiento de la máquina, no la autoría ni un dominio completo. Acepta programas correctos equivalentes; las soluciones públicas son modelos, no las únicas respuestas posibles.

Material didáctico público. Las soluciones son ejemplos; otros programas correctos equivalentes pueden superar las comprobaciones.

16. Factorial e invariantes de bucle

Usa un acumulador multiplicativo y explica por qué 0! es 1.

Abrir esta lección →

1. Predecir y trazar

Antes de ejecutar el programa de prueba, predice su salida y traza las tres primeras instrucciones ejecutadas. Sigue los registros, indicadores o memoria relevantes. Después avanza paso a paso para comparar.

LOAD 4 R1
LOAD 1 R2
LOOP 4
LOAD R2
MUL R1
COPY R0 R2
LOAD R1
SUB 1
COPY R0 R1
RETURN
LOAD R2
PRINT
HALT

Añadir entradas a la cola: Ninguno

Inicializar memoria: Todos los bytes empiezan en cero

Solución de la predicción

Salida: 24

InstrucciónPC antesPC despuésR0 antesR0 despuésEstado relevanteSalida
LOAD0100{"registers":[0,4,0,0,0,0,0,0],"flags":{"zero":false,"negative":false,"overflow":false},"sp":255,"stack":[],"callStack":[],"loopStack":[],"memoryReads":[],"memoryWrites":[]}Ninguno
LOAD1200{"registers":[0,4,1,0,0,0,0,0],"flags":{"zero":false,"negative":false,"overflow":false},"sp":255,"stack":[],"callStack":[],"loopStack":[],"memoryReads":[],"memoryWrites":[]}Ninguno
LOOP2300{"registers":[0,4,1,0,0,0,0,0],"flags":{"zero":false,"negative":false,"overflow":false},"sp":255,"stack":[],"callStack":[],"loopStack":[{"start":2,"end":9,"remaining":4,"callDepth":0}],"memoryReads":[],"memoryWrites":[]}Ninguno

2. Construir y comprobar

Lee N entre 0 y 6 e imprime N!. Usa un bucle y un acumulador de multiplicación.

Tipos de instrucción requeridos: INPUT, LOOP, MUL

Ejemplo de solución del reto

INPUT
COPY R0 R1
COPY R0 R3
LOAD 1 R2
LOOP R3
LOAD R2
MUL R1
COPY R0 R2
LOAD R1
SUB 1
COPY R0 R1
RETURN
LOAD R2
PRINT
HALT

Casos reales del comprobador

Caso 1
Entrada
0
Memoria inicial
Todos los bytes empiezan en cero
Salida esperada
1
Caso 2
Entrada
4
Memoria inicial
Todos los bytes empiezan en cero
Salida esperada
24
Caso 3
Entrada
6
Memoria inicial
Todos los bytes empiezan en cero
Salida esperada
720

3. Explicar la máquina

¿Por qué empieza el acumulador de producto en 1?

Razonamiento y nota docente

1 es el elemento neutro multiplicativo; cero iteraciones dan 0! = 1. Empezar en 0 anularía todos los productos.