2014-02-19 53 views
0

我正在尝试在MIPS语言中执行此代码几天,并没有任何好的结果,我不知道该怎么做!你可以帮我吗? 谢谢”MIPS:递归

int function1(int n){ 
    if (n <= 2) 
     return -15; 
    else{ 
     int comp = 6*function1(n-1) + (-2)*function1(n-2) + 3*n; 
     return comp; 
    } 
} 
+1

你的避风港没有向我们展示你的任何尝试,所以我们不可能知道你遇到了什么问题 – Michael

+0

看起来像一个适当的递归给我 - 至少它不会进入无限循环,逻辑错综复杂,不知道它应该算什么样的数学实行。有什么问题? –

回答

1

的方法是相当简单的,它被修改斐波那契数函数,其中系数添加每次递归调用代码如下:。

.text 

#recursive recurent function. similar as fibonacci, with smaller modifications 
RecurentFunction: 
    sub  $sp, $sp, 12      #allocate 12B on stack 
    sw  $ra, 0($sp)       #save return address 
    sw  $a0, 4($sp)       #save argument 

    ble  $a0, 2,  exit_recurentfunction #if argumrnt is <= 2 go to exit and return -15 
    sub  $a0, $a0, 1      #set n = n - 1 
    jal  RecurentFunction      #recursive call 
    mulo $v0, $v0, 6      #multiply result with 6, as requested: 6*function1(n-1) 
    sw  $v0, 8($sp)       #save result 

    lw  $a0, 4($sp)       #load argument, as it's overwrittent by previous calls 
    sub  $a0, $a0, 2      #set n = n - 2 
    jal  RecurentFunction      #recursive call 
    mulo $v0, $v0, -2      #multiply result with -2, as requested: (-2)*function1(n-2) 

    lw  $t0, 8($sp)       #load previous result 
    add  $v0, $v0, $t0      #add previous result to current result 

    lw  $t0, 4($sp)       #load argument, as it's overwrittent by previous calls 
    mulo $t0, $t0, 3      #multiply by 3, as requested: 3*n 
    add  $v0, $v0, $t0      #add to result 

    lw  $ra, 0($sp)       #load return address 
    addi $sp, $sp, 12      #free stack 
    jr  $ra          #return 

exit_recurentfunction: 
    li  $v0, 15 
    lw  $ra, 0($sp)       #load return address 
    addi $sp, $sp, 12      #free stack 
    jr  $ra          #return 

main: 
    li  $a0, 4        #set $a0 = 54, argument for function call 
    jal  RecurentFunction      #call RecurentFunction 

    move $a0, $v0        #move result to $a0 
    li  $v0, 1        #set $v0 = 1, system call for print int 
    syscall 

    li  $v0, 10        #set $v0 = 10, system call for exit program 
    syscall 

.data 

希望它可以帮助