在 MIPS 递归中打印列表
Printing list in MIPS recursion
目前,我正在使用MIPS,我想知道我应该对以下代码进行哪些修改(打印列表的递归函数):
printList:
addi $sp, $sp, -8
sw $ra, 0($sp)
beqz $a0, endRec
lw $t0, 0($a0)
sw $t0, 4($sp)
lw $a0, 4($a0)
jal printList
lw $a0, 4($sp)
li $v0, 1
syscall
la $a0, str
li $v0, 4
syscall
endRec:
lw $ra, 0($sp)
addi $sp, $sp, 8
jr $ra
这样它以“正常”顺序打印列表(例如,如果我在末尾添加元素,1 2 3,我希望它像那样打印它而不是像 3 2 1)。
注意:str 是在数据段中定义的 blanco。
我也知道我可以做反向列表然后调用那个函数,但是有更简单的方法吗?
虽然你在 MIPS 中工作,但这并不是真正的 MIPS 问题,它是递归的一般问题。
在递归中,假设我们有:
recursiveFunction (...) {
if condition then exit
// do some work #1
recursiveFunction (...);
// do some other work #2
}
在标记为 #1 的部分中完成的工作将在递归之前发生,例如关于递归下降——从某种意义上说,这是向前发生的。
标记为#2 的部分中完成的工作将在递归之后发生,例如关于递归的展开——从某种意义上说,这是倒退的。
如果你把打印放在#2 部分,列表会倒过来。如果您将打印内容放在第 1 部分,列表将向前显示。
目前,我正在使用MIPS,我想知道我应该对以下代码进行哪些修改(打印列表的递归函数):
printList:
addi $sp, $sp, -8
sw $ra, 0($sp)
beqz $a0, endRec
lw $t0, 0($a0)
sw $t0, 4($sp)
lw $a0, 4($a0)
jal printList
lw $a0, 4($sp)
li $v0, 1
syscall
la $a0, str
li $v0, 4
syscall
endRec:
lw $ra, 0($sp)
addi $sp, $sp, 8
jr $ra
这样它以“正常”顺序打印列表(例如,如果我在末尾添加元素,1 2 3,我希望它像那样打印它而不是像 3 2 1)。 注意:str 是在数据段中定义的 blanco。 我也知道我可以做反向列表然后调用那个函数,但是有更简单的方法吗?
虽然你在 MIPS 中工作,但这并不是真正的 MIPS 问题,它是递归的一般问题。
在递归中,假设我们有:
recursiveFunction (...) {
if condition then exit
// do some work #1
recursiveFunction (...);
// do some other work #2
}
在标记为 #1 的部分中完成的工作将在递归之前发生,例如关于递归下降——从某种意义上说,这是向前发生的。
标记为#2 的部分中完成的工作将在递归之后发生,例如关于递归的展开——从某种意义上说,这是倒退的。
如果你把打印放在#2 部分,列表会倒过来。如果您将打印内容放在第 1 部分,列表将向前显示。