2014-02-19 3 views
0

Я пытаюсь сделать этот код на языке MIPS в течение нескольких дней и не имел хороших результатов, я не знаю, что делать !! Вы можете мне помочь? спасибо»MIPS: Recursion

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

Вы убежище 't показал нам какие-либо ваши попытки, поэтому мы не можем знать, с чем вы столкнулись. – 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 

Надеется, что это помогает