You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MIPS汇编递归计算3的阶乘结果错误(得4而非6)求修复

问题分析与修复

你的代码存在两个关键错误导致输出异常:

1. main函数中丢失阶乘结果

调用factorial后,阶乘结果存在$v0中,但你紧接着执行li $v0, 4(设置系统调用为打印字符串),直接覆盖了$v0里的结果。后续move $a0, $v0实际取的是4,因此输出4。

2. factorial函数递归计算逻辑错误

在递归调用前,你直接修改了$a0(addi $a0, $a0, -1)但未保存原始的n值,导致相乘时使用的是n-1而非原始n,违背了阶乘公式n! = n * (n-1)!。


修复后的完整代码

.data
result_str:     .asciiz "Factorial of 3 = "
newline:        .asciiz "\n"

    .text
    .globl main

main:
    # Calculates the factorial of 3
    li $a0, 3
    jal factorial

    # 先保存阶乘结果到$s0,避免被后续系统调用覆盖
    move $s0, $v0     

    # Prints the result string
    li $v0, 4        
    la $a0, result_str  
    syscall

    # 打印阶乘结果
    move $a0, $s0     
    li $v0, 1         
    syscall

    # Prints a newline
    li $v0, 4
    la $a0, newline
    syscall

    # Exits program
    li $v0, 10
    syscall

factorial:
    # Save return address and original n value
    addi $sp, $sp, -8
    sw $ra, 4($sp)
    sw $s0, 0($sp)

    # if n <= 1 return 1
    li $t0, 1
    ble $a0, $t0, base_case

    # 保存原始n值到$s0
    move $s0, $a0
    # 计算n-1并递归调用
    addi $a0, $a0, -1   
    jal factorial

    # 用原始n值乘以递归结果:n * (n-1)!
    mul $v0, $s0, $v0  

    lw $ra, 4($sp)
    lw $s0, 0($sp)
    addi $sp, $sp, 8
    jr $ra

base_case:
    # If n <= 1 return 1
    li $v0, 1

    lw $ra, 4($sp)
    lw $s0, 0($sp)
    addi $sp, $sp, 8
    jr $ra

修复说明

  • main函数:在调用factorial后立即将$v0中的结果转移到s0保存,避免后续系统调用修改$v0导致结果丢失。
  • factorial函数:递归调用前将原始n值保存到$s0,递归返回后用原始n值乘以(n-1)!的结果,符合阶乘的数学定义。

内容的提问来源于stack exchange,提问作者Aiden Haley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:44:54