Recursion 递归

Recursion 递归,recursion,mips,Recursion,Mips,我尝试用MIPS语言编写这段代码已经有几天了,但没有得到任何好的结果,我不知道该怎么做!!你能帮助我吗? 谢谢你” int函数1(int n){ 如果(n该方法非常简单。它是改进的斐波那契函数,其中系数与每个递归调用相加。代码如下: .text #recursive recurent function. similar as fibonacci, with smaller modifications RecurentFunction: sub $sp, $sp,

我尝试用MIPS语言编写这段代码已经有几天了,但没有得到任何好的结果,我不知道该怎么做!!你能帮助我吗? 谢谢你”

int函数1(int n){

如果(n该方法非常简单。它是改进的斐波那契函数,其中系数与每个递归调用相加。代码如下:

    .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
.text
#递归递归函数。类似于斐波那契函数,修改较小
递归函数:
低于$sp,$sp,12#在堆栈上分配12B
sw$ra,0($sp)#保存返回地址
sw$a0,4($sp)#保存参数

ble$a0,2,exit_RecurrentFunction#如果argumrnt是您没有向我们展示您的任何尝试,因此我们不可能知道您遇到了什么问题。在我看来,这是一个正确的递归-至少它不会进入无限循环。逻辑是复杂的,不确定它应该实现什么类型的数学。问题是什么?
    .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