16. 阶乘与循环不变量
使用乘法累加器,并解释为什么 0! 等于 1。
1. 预测与跟踪
运行试做程序前,预测输出,并跟踪最先执行的三条指令。按需要记录相关寄存器、标志或内存,再逐步执行进行比较。
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
加入输入队列: 无
初始化内存: 所有字节初始为零
试做预测答案
输出: 24
| 指令 | 执行前 PC | 执行后 PC | 执行前 R0 | 执行后 R0 | 相关状态 | 输出 |
|---|---|---|---|---|---|---|
| LOAD | 0 | 1 | 0 | 0 | {"registers":[0,4,0,0,0,0,0,0],"flags":{"zero":false,"negative":false,"overflow":false},"sp":255,"stack":[],"callStack":[],"loopStack":[],"memoryReads":[],"memoryWrites":[]} | 无 |
| LOAD | 1 | 2 | 0 | 0 | {"registers":[0,4,1,0,0,0,0,0],"flags":{"zero":false,"negative":false,"overflow":false},"sp":255,"stack":[],"callStack":[],"loopStack":[],"memoryReads":[],"memoryWrites":[]} | 无 |
| LOOP | 2 | 3 | 0 | 0 | {"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":[]} | 无 |
2. 构建与检查
读取 0 到 6 的 N,输出 N!。使用循环和乘法累加器。
必需的指令类型: INPUT, LOOP, MUL
挑战示例答案
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
实际检查器测试数据
案例 1
- 输入
0- 初始内存
所有字节初始为零- 预期输出
1
案例 2
- 输入
4- 初始内存
所有字节初始为零- 预期输出
24
案例 3
- 输入
6- 初始内存
所有字节初始为零- 预期输出
720
3. 解释机器
乘积累加器为什么从 1 开始?
推理与教学说明
1 是乘法单位元;零轮得到 0!=1。从 0 开始会让所有乘积为 0。