MIPS汇编语言实现递归斐波那契数列

本文提供了一种使用MIPS汇编语言实现斐波那契数列的代码示例,包括基本递归版本和使用存储数据优化递归的版本,旨在展示MIPS汇编语言在递归函数中的应用。

有这篇博文的原因就是自己找了半天没找到类似的代码(想抄作业的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写递归需要注意的就是…一定一定观察你递归的函数中的值是否还是它本身(而不是在递归过程中被其他值给取代了),如果必要要将中间变量也存放在栈中。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值