有这篇博文的原因就是自己找了半天没找到类似的代码(想抄作业的hhhhhhh)就献丑把自己写的发上来了
没怎么写注释,大家意会一下吧…
递归版本
.text
main:
li $a0,3
jal fib
addi $a0,$v0,0
li $v0,1
syscall
li $v0 10
syscall
fib:
addi $sp,$sp,-16
sw $t4,12($sp)
sw $t3,8($sp)
sw $ra, 4($sp)
sw $a0, 0($sp)
li $s7,2
ble $s7,$a0,other
beq $a0,0,zero
addi $v0,$zero,1
addi $sp,$sp,16
jr $ra
other:
addi $a0,$a0,-1
jal fib
addi $t3,$v0,0 #计算f(n-1)
addi $a0,$a0,-1
jal fib
addi $t4,$v0,0 #计算f(n-2)
add $v0,$t3,$t4
lw $a0,0($sp)
lw $ra,4($sp)
lw $t3,8($sp)
lw $t4,12($sp)
addi $sp,$sp,16
jr $ra
zero:
addi $v0,$zero,0
addi $sp,$sp,16
jr $ra
存储数据的递归版本(就是你学的辣个用空间复杂度节约时间复杂度的)
.text
main:
li $a0,6
la $s1,memolist
jal fib
addi $a0,$v0,0
li $v0,1
syscall
li $v0 10
syscall
fib:
addi $sp,$sp,-16
sw $t4,12($sp)
sw $t3,8($sp)
sw $ra, 4($sp)
sw $a0, 0($sp)
beq $a0,0,zero
beq $a0,1,one
sll $t0,$a0,2
add $t0,$s1,$t0
addi $t1,$zero,1
lw $s2,0($t0) #memolist[n]
ble $t1,$s2,nonzero
j other
other:
addi $a0,$a0,-1
jal fib
addi $t3,$v0,0 #计算f(n-1)
addi $a0,$a0,-1
jal fib
addi $t4,$v0,0 #计算f(n-2)
add $v0,$t3,$t4
lw $a0,0($sp)
lw $ra,4($sp)
lw $t3,8($sp)
lw $t4,12($sp)
addi $sp,$sp,16
jr $ra
zero:
addi $v0,$zero,0
addi $sp,$sp,16
jr $ra
one:
addi $v0,$zero,1
addi $sp,$sp,16
jr $ra
nonzero:
addi $v0,$s2,0
addi $sp,$sp,16
jr $ra
.data
memolist:
.space 400
应该执行结果没什么问题,如果有bug的话各位自己调叭…
emmmm用mips写递归需要注意的就是…一定一定观察你递归的函数中的值是否还是它本身(而不是在递归过程中被其他值给取代了),如果必要要将中间变量也存放在栈中。