MIPS递归与迭代求和结果不一致问题求助
问题分析与修正代码
原代码的核心问题
- 传参错误:递归调用时用了未初始化的
$s0,应该传入存储输入值的$t0。 - 结果被覆盖:调用递归后没及时保存
$v0中的结果,后续打印换行的syscall把$v0改成了4,导致正确结果丢失。 - 递归逻辑不严谨: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导致结果丢失。 - 递归逻辑修正:实现标准递归流程:
- 处理base case(n≤0返回0);
- 保存返回地址
$ra和当前n到栈中; - 递归调用sum(n-1);
- 恢复寄存器,将当前n与子问题结果相加得到最终结果。
- 输出顺序调整:把换行打印移到最后,避免干扰结果保存。
内容的提问来源于stack exchange,提问作者user22742077
相关产品推荐
相关产品推荐

