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

MIPS递归三角数程序问题:输入任意值均返回1

MIPS递归三角数程序修复方案

核心错误分析

  1. 打印逻辑覆盖结果:调用triangle子程序后,计算结果存在$v0,但后续执行li $v0, 1(打印整数的系统调用码)直接覆盖了结果,导致始终打印1。
  2. 递归计算值混淆:
    • 递归返回后,错误地将栈中保存的原N当作Triangle(N-1)的结果,实际递归结果存在$v0。
    • 计算N + Triangle(N-1)时,误用了已经减1的$a0(即N-1),而非原N。
  3. 栈帧未完整恢复:base_case跳转后未执行栈帧恢复操作,导致递归返回时栈指针和寄存器状态异常。
  4. 边界条件不全:仅判断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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 08:38:12