MIPS递归三角数程序问题:输入任意值均返回1
MIPS递归三角数程序修复方案
核心错误分析
- 打印逻辑覆盖结果:调用
triangle子程序后,计算结果存在$v0,但后续执行li $v0, 1(打印整数的系统调用码)直接覆盖了结果,导致始终打印1。 - 递归计算值混淆:
- 递归返回后,错误地将栈中保存的原N当作
Triangle(N-1)的结果,实际递归结果存在$v0。 - 计算
N + Triangle(N-1)时,误用了已经减1的$a0(即N-1),而非原N。
- 递归返回后,错误地将栈中保存的原N当作
- 栈帧未完整恢复:
base_case跳转后未执行栈帧恢复操作,导致递归返回时栈指针和寄存器状态异常。 - 边界条件不全:仅判断
N == 1进入base case,未覆盖N < 1的情况(符合题目N ≤1返回1的定义)。
修复后的完整代码
.data prompt: .asciiz "Enter a positive integer (N): " result_msg: .asciiz "The triangle number is: " .text main: # Prompt user input li $v0, 4 # syscall code for print_str la $a0, prompt # load address of prompt string syscall # Read user input li $v0, 5 # syscall code for read_int syscall move $s0, $v0 # store input # Call recursive subroutine move $a0, $s0 # pass N as an argument jal triangle move $s1, $v0 # 保存递归结果,避免被后续系统调用覆盖 # Print result li $v0, 4 # syscall code for print_str la $a0, result_msg # load address of result_msg string syscall li $v0, 1 # syscall code for print_int move $a0, $s1 # 打印保存的递归结果 syscall # Exit li $v0, 10 # syscall code for exit syscall # Recursive subroutine to compute triangle numbers triangle: # Function prologue addi $sp, $sp, -8 sw $ra, 4($sp) sw $a0, 0($sp) # Base case: Triangle(N ≤ 1) = 1 li $t0, 1 ble $a0, $t0, base_case # 改为ble覆盖N≤1的情况 # Recursive case: Triangle(N) = N + Triangle(N-1) addi $a0, $a0, -1 # N-1 jal triangle # recursive call,结果存在$v0 lw $t1, 0($sp) # 取出原N add $v0, $t1, $v0 # 原N + Triangle(N-1)的结果 # Function epilogue lw $ra, 4($sp) lw $a0, 0($sp) addi $sp, $sp, 8 jr $ra # Base case handling base_case: li $v0, 1 # return value 1 for base case # 执行栈帧恢复再返回 lw $ra, 4($sp) lw $a0, 0($sp) addi $sp, $sp, 8 jr $ra
关键修改说明
- 主程序:调用
triangle后用$s1保存结果,打印时使用$s1而非被覆盖的$v0。 - 递归边界:将
beq改为ble,覆盖所有N ≤1的情况。 - 递归计算:递归返回后,从栈中取出原N,与
$v0(递归结果)相加,得到正确的N + Triangle(N-1)。 - 栈帧恢复:
base_case中添加栈帧恢复代码,不再跳转至单独的end_recursive,避免栈状态异常。
内容的提问来源于stack exchange,提问作者Hydro
相关产品推荐
相关产品推荐

