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

MIPS编程:如何实现$a0≥1时分支链接并修正递归终止条件

MIPS递归函数修改方案:终止于1而非0

可以通过调整递归判断条件,利用bgezal指令的特性实现需求,无需创建新子程序。核心思路是将递归触发条件从当前值减1后≥0改为当前值减1后≥1(即原输入值≥2),通过将判断值转换为与0比较的形式适配bgezal的逻辑。

修改后的代码如下:

RDemo:
    addi $sp, $sp, -4
    sw $ra, 0($sp)

    # 打印当前输入值
    li $v0, 1
    syscall

    move $t0, $a0          # 保存当前输入值到临时寄存器$t0
    addi $a0, $t0, -2      # 计算当前值减2,用于判断是否满足递归条件(原输入≥2)
    bgezal $a0, do_recursion # 若当前值≥2,跳转执行递归
    j skip_recursion

do_recursion:
    move $a0, $t0          # 恢复原输入值
    addi $a0, $a0, -1      # 设置递归参数为当前值减1
    jal RDemo              # 调用递归函数

skip_recursion:
    move $a0, $t0          # 恢复原输入值用于打印
    li $v0, 1
    syscall

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

逻辑说明:

  1. 打印当前输入值后,将值存入$t0临时寄存器保存,避免后续修改丢失。
  2. 通过计算当前值-2,将“原输入≥2”的条件转换为“计算结果≥0”,刚好适配bgezal指令的判断逻辑(bgezal会在$a0≥0时跳转并链接)。
  3. 若满足递归条件,恢复原输入值并将参数设为当前值-1,调用递归函数;不满足则直接跳过递归。
  4. 递归返回后(或跳过递归后),再次打印原输入值,完成对称输出。

当输入3时,执行流程为:
RDemo(3) → 打印3 → 满足递归条件 → 调用RDemo(2) → 打印2 → 满足递归条件 → 调用RDemo(1) → 打印1 → 不满足递归条件 → 打印1 → 返回RDemo(2) → 打印2 → 返回RDemo(3) → 打印3,最终输出3, 2, 1, 1, 2, 3。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:00:27