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

