Corrigé pour l’enseignant

Des algorithmes avec un état

Recueillez quatre types d’indices : prédiction de l’état pertinent ; comportement dans des cas variés, y compris aux limites ; explication fondée sur la trace et l’état ; correction justifiée d’un écart. Évaluez chacun comme en développement, avec soutien ou autonome, sur papier ou selon la procédure approuvée de votre école. Réussir un défi prouve un comportement de la machine, pas la paternité du code ni une maîtrise complète. Acceptez les programmes équivalents corrects : le corrigé public est un modèle, pas l’unique réponse possible.

Matériel pédagogique public. Les solutions sont des exemples ; des programmes équivalents corrects peuvent aussi réussir les vérifications réelles.

16. Factorielle et invariants de boucle

Utilisez un accumulateur multiplicatif et expliquez pourquoi 0! vaut 1.

Ouvrir cette leçon →

1. Prévoir et tracer

Avant d’exécuter le programme d’essai, prévoyez sa sortie et tracez les trois premières instructions exécutées. Suivez les registres, les indicateurs ou la mémoire pertinents, selon le besoin. Avancez ensuite pas à pas pour comparer.

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

Ajouter les entrées à la file: Aucune

Initialiser la mémoire: Tous les octets sont initialement nuls

Corrigé de la prédiction d’essai

Sortie: 24

InstructionPC avantPC aprèsR0 avantR0 aprèsÉtat pertinentSortie
LOAD0100{"registers":[0,4,0,0,0,0,0,0],"flags":{"zero":false,"negative":false,"overflow":false},"sp":255,"stack":[],"callStack":[],"loopStack":[],"memoryReads":[],"memoryWrites":[]}Aucune
LOAD1200{"registers":[0,4,1,0,0,0,0,0],"flags":{"zero":false,"negative":false,"overflow":false},"sp":255,"stack":[],"callStack":[],"loopStack":[],"memoryReads":[],"memoryWrites":[]}Aucune
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":[]}Aucune

2. Construire et vérifier

Lisez N de 0 à 6 et affichez N!. Utilisez une boucle et un accumulateur de multiplication.

Types d’instructions requis: INPUT, LOOP, MUL

Exemple de solution du défi

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

Cas réels du vérificateur

Cas 1
Entrée
0
Mémoire initiale
Tous les octets sont initialement nuls
Sortie attendue
1
Cas 2
Entrée
4
Mémoire initiale
Tous les octets sont initialement nuls
Sortie attendue
24
Cas 3
Entrée
6
Mémoire initiale
Tous les octets sont initialement nuls
Sortie attendue
720

3. Expliquer la machine

Pourquoi l’accumulateur de produit commence-t-il à 1 ?

Raisonnement et note pédagogique

1 est l’élément neutre de la multiplication ; zéro itération donne 0! = 1. Commencer à 0 rendrait tous les produits nuls.