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

题目如下:


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


 


 


##f(n)


Func:


        ##入栈


        addi$sp,$sp,-20


        sw$ra,16($sp)


        sw$a0,12($sp)


        sw$t0,8($sp)


        sw$t1,4($sp)


        sw$t2,0($sp)


 


        addi$t0,$zero,0


        addi$t1,$zero,1


        addi$t2,$zero,2


        


        ##判断是否为0


        bne$a0,$t0,Not_zero


        ##0返回0


        add$v0,$zero,$zero


        lw$t2,0($sp)


        lw$t1,4($sp)


        lw$t0,8($sp)


        lw$a0,12($sp)


        lw$ra,16($sp)


        addi$sp,$sp,20


        jr$ra


 


Not_zero:


        ##判断是否为1


bne$a0,$t1,Not_one


##1返回1


        addi$v0,$zero,1


        lw$t2,0($sp)


        lw$t1,4($sp)


        lw$t0,8($sp)


        lw$a0,12($sp)


        lw$ra,16($sp)


        addi$sp,$sp,20      


        jr$ra


 


Not_one:


        ##判断是否为2


        bne$a0,$t2,Not_two


        ##2返回2


        addi$v0,$zero,2


        lw$t2,0($sp)


        lw$t1,4($sp)


        lw$t0,8($sp)


        lw$a0,12($sp)


        lw$ra,16($sp)


        addi$sp,$sp,20


        jr$ra


 


Not_two:


        ##不是1,2,3调用f(n-1),f(n-2),f(n-3)存储于$t0,$t1,$t2


        addi$a0,$a0,-1


        jalFunc


        add$t0,$zero,$v0


 


        addi$a0,$a0,-1


        jalFunc


        add$t1,$zero,$v0


 


        addi$a0,$a0,-1


        jalFunc


        add$t2,$zero,$v0


 


        ##计算f(n-1) +2*f(n-2) * f(n-3)并返回


        add$v0,$t0,$t1


        add$v0,$v0,$t1


        add$v0,$v0,$t2


        add$v0,$v0,$t2


        add$v0,$v0,$t2                            


 


        ##出栈


        lw$t2,0($sp)


        lw$t1,4($sp)


        lw$t0,8($sp)


        lw$a0,12($sp)


        lw$ra,16($sp)


        addi$sp,$sp,20


        jr$ra


以上。




你可能感兴趣的:(mips)