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

MIPS递归与迭代求和结果不一致问题求助

问题分析与修正代码

原代码的核心问题

  1. 传参错误:递归调用时用了未初始化的$s0,应该传入存储输入值的$t0。
  2. 结果被覆盖:调用递归后没及时保存$v0中的结果,后续打印换行的syscall把$v0改成了4,导致正确结果丢失。
  3. 递归逻辑不严谨:base case处理n≤0时返回1,不符合求和逻辑(sum(0)应为0),且原函数的递归写法冗余,不是标准的递归实现。

修正后的完整代码

.data
    integer:    .asciiz "\nEnter a positive integer: "
    result_1:   .asciiz "(Iterative)Sum from 1 to n: "
    result_2:   .asciiz "\n(Recursive)Sum from 1 to n: "
    newline:    .asciiz "\n"

.text
    main:
        # 提示输入
        li $v0, 4
        la $a0, integer
        syscall

        # 读取输入的n
        li $v0, 5
        syscall
        move $t0, $v0  

        # --- 迭代求和 ---
        li $t1, 0   # 迭代结果初始化为0
        li $t2, 1   # 计数器从1开始

        loop_iterative:
            add $t1, $t1, $t2   # 累加计数器到结果
            addi $t2, $t2, 1     # 计数器+1
            ble $t2, $t0, loop_iterative  # 计数器≤n则继续循环
        
        # --- 递归求和 ---
        move $a0, $t0           # 传入参数n到$a0
        jal calculate_sum       
        move $t3, $v0           # 保存递归结果到$t3,避免被后续syscall覆盖

        # --- 输出结果 ---
        # 打印迭代结果
        li $v0, 4
        la $a0, result_1
        syscall
        move $a0, $t1
        li $v0, 1
        syscall

        # 打印递归结果
        li $v0, 4
        la $a0, result_2
        syscall
        move $a0, $t3
        li $v0, 1
        syscall

        # 换行
        li $v0, 4
        la $a0, newline
        syscall

        # 退出程序
        li $v0, 10
        syscall
            
# 递归求和函数:sum(n) = n + sum(n-1),base case sum(0)=0
calculate_sum:
    # base case:n≤0时返回0
    blez $a0, base_case

    # 保存寄存器到栈(因为递归调用会覆盖$ra和$a0)
    addi $sp, $sp, -8
    sw $ra, 4($sp)
    sw $a0, 0($sp)

    # 递归调用sum(n-1)
    addi $a0, $a0, -1
    jal calculate_sum

    # 恢复寄存器,计算当前结果:sum(n) = n + sum(n-1)
    lw $a0, 0($sp)
    add $v0, $v0, $a0
    lw $ra, 4($sp)
    addi $sp, $sp, 8

    jr $ra

base_case:
    li $v0, 0
    jr $ra

关键修改说明

  • 传参修正:将move $a0, $s0改为move $a0, $t0,确保递归函数拿到正确的输入n。
  • 结果保存:调用递归后用move $t3, $v0保存结果,避免后续打印指令修改$v0导致结果丢失。
  • 递归逻辑修正:实现标准递归流程:
    1. 处理base case(n≤0返回0);
    2. 保存返回地址$ra和当前n到栈中;
    3. 递归调用sum(n-1);
    4. 恢复寄存器,将当前n与子问题结果相加得到最终结果。
  • 输出顺序调整:把换行打印移到最后,避免干扰结果保存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:40:53