尝试创建一个函数,使得f(0)= 8,并且f(n)= 4f(n-1) - n + 5,如果n> 0递归,但无法使其正常运行
# $a0 = inpyt
# $v0 = return value
f: bnez $a0, greaterthan0
li $v0, 8
jr $ra
greaterthan0: addi $sp,$sp,-8
sw $ra, 0($sp)
sw $a0,4($sp)
sub $t3,$a0,1 # n-1=n
jal f
lw $ra, ($sp)
lw $a0, 4($sp)
addi $sp,$sp,8
sll $t0,$t3,2 # mul n-1 by 4
sub $t1,$t0,$t3
addi $t2,$t1,5 # add 5 to n
jr $ra
答案 0 :(得分:1)
这里有一些问题。
这里的第一个问题是你没有遵循你已经通过传递$a0
中的输入并返回$v0
中的值而设定的约定。
要解决此问题,请将sub $t3,$a0,1 # n-1=n
更改为sub $a0,$a0,1 # n-1=n
和addi $t2,$t1,5 # add 5 to n
到addi $v0,$t1,5 # add 5 to n
。
接下来,您会选择一些数学错误来评估f(n-1) - n + 5
。
首先,评论mul n-1 by 4
从根本上是错误的,因为我们实际上希望多次f(n-1)
为4.在递归调用返回后,f(n-1)
的值当然存储在{ {1}}。
以下是我的修复:
$v0