题目如下:
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
以上。