【计组】MIPS实现的递归函数的非递归实现

博客展示了如何使用MIPS汇编语言实现递归函数f(n)=f(n-1)+2*f(n-2)+3*f(n-3)的非递归版本。通过输入n、f(0)、f(1)和f(2),程序计算并输出结果。代码已在QtSpim上编译和运行成功。
摘要由CSDN通过智能技术生成

题目如下:


f(n)=f(n-1)+2*f(n-2)+3*f(n-3)

f(0)=0,f(1)=1,f(2)=2

这是用C++运行得到的结果。

以下的代码均在QtSpim上面编译且运行通过了。


首先来一发非递归的程序。


#Time: 2014/11/1
#Programmer: zorroshen
#######################

 .data  #用于储存数据的
 string1: .asciiz"Please input n:"
 string2: .asciiz"The result is:"
 string3: .asciiz"Please input f(0):"
 string4: .asciiz"Please input f(1):"
 string5: .asciiz"Please input f(2):"
 .text#这一句一定要有,不然报错
main: li $v0,4#一定要有main函数
 la $a0,string1
 syscall#输出一个string

 li $v0,5
 syscall
 move $a0,$v0#输入得到第一个参数在$a0中
 move $t6,$a0  #$t6=n
  
 li $v0,4
 la $a0,string3
 syscall

 li $v0,5
 syscall
 move $s0,$v0  #$s0=f(0)

 li $v0,4
 la $a0,string4
 syscall

 li $v0,5
 syscall
 move $s1,$v0  #$s1=f(1)
 
 li $v0,4
 la $a0,string5
 syscall

 li $v0,5
 syscall
 move $s2,$v0  #$s2=f(2)
 #move $s0,$zero
 #addi   $s1,$s0,1
 #addi   $s2,$s1,1
 add $t0,$zero,$zero
 addi $t1,$t0,1
 addi $t2,$t1,1
 beq $t0,$t6,EXIT0
 beq $t1,$t6,EXIT1
 beq $t2,$t6,EXIT2
 addi $t6,$t6,-2
function: 
 add $s3,$s2,$s1
 add $s3,$s3,$s1
 add $s3,$s3,$s0
 add $s3,$s3,$s0
 add $s3,$s3,$s0
 addi $t6,$t6,-1
 beq $t6,$zero,EXIT
 add $s0,$s1,$zero
 add $s1,$s2,$zero
 add $s2,$s3,$zero
 j function
EXIT0: move $s3,$s0
 j EXIT
EXIT1: move $s3,$s1
 j EXIT
EXIT2: move $s3,$s2
 j EXIT
EXIT: 
 li $v0,4
 la $a0,string2
 syscall

 move $a0,$s3
 li $v0,1
 syscall
 jr $ra


下面是一个非递归的程序。本来是挺容易理解的,但是为了判断递归终止的条件,反而变得更长了。


以下是源码。



.text


##主函数


main:


        addi$v0,$zero,5


        syscall


        add$a0,$v0,$zero


        jalFunc


        add$a0,$zero,$v0


        addi$v0,$zero,1


        syscall


        addi$v0,$zero,10


        syscall


 


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值