Двойная рекурсия в сборке работает, пока вторичная рекурсия не станет больше, чем базовый вариант - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь закодировать программу на ассемблере, которая будет запрашивать целое число и выполнять рекурсивную функцию: if n>5 f(n) = n*f(n-1)-f(n-3)+n-23 else n<=5 f(n)=15-2n Мне удалось получить первый экземпляр рекурсии n*f(n-1), но когда он перешел ко второй рекурсии f(n-3) он выполняет вторую часть неправильно.

Во время вычислений, если я введу 8 как целое число, результат должен быть 20, который я получаю, но когда я ввожу что-то больше 8, потому что тогда вторая рекурсия попадетцелое число больше 5 (базовый вариант) я получаю неправильный ответ.В основном, любой ввод больше 8 не работает. Например, правильные ответы:

f(9) = 162
f(10) = 1602
f(11) = 17590

Ответы, которые я получаю

f(9)= 27
f(10)=22 
f(11)=23

Вот мой код:

    ```#data declarations: declare variable names used in program, storage allocated in RAM
                                .data   
    prompt1:    .asciiz "\nEnter an Integer:\n" #Ending Index
    message1:   .asciiz "\nThe Solution is:\n"
    answer: .word   0


    #program code is contained below under .text
                            .text 
                            .globl    main    #define a global function main

    # the program begins execution at main()

    main:   
        la  $a0, prompt1    #load address of prompt1
        li  $v0, 4      #prepare print string
        syscall
        li  $v0, 5      #prepare receive int
        syscall
        move    $a0, $v0

        addi    $sp, $sp, -4
        sw  $ra, 0($sp) 
        jal Function
        sw  $v0, answer #move returned answer to a new memory
        lw  $ra, 0($sp)
        addi    $sp, $sp, 4

        la  $a0, message1   #load address of message1
        li  $v0, 4      #prepare print string
        syscall
        lw  $a0, answer
        li  $v0, 1
        syscall

        jr  $ra
    ############################################################################
    # Procedure/Function Function1
    # Description: recursive math function
    # parameters: $a0 = value of n, 
    # return value: $v0 = answer
    # registers to be used: $s3 and $s4 will be used.
    ############################################################################
    Function:

        addi    $sp, $sp, -12   #adjust stack pointer
        sw  $ra, 8($sp) #save return address    
        sw  $a0, 4($sp) #save n
        sw  $s0, 0($sp) #save immediate value (used for storing function(n-1))  


        li  $t2, 15

        slti    $t0, $a0, 6
        beq $t0, $zero, GreaterThanFive


    LessThanFive:
        add     $t1, $a0, $zero
        add $t1, $t1, $a0
        sub $t2, $t2, $t1
        move    $v0, $t2    
        j   Conclusion
    GreaterThanFive:

        addi    $a0, $a0, -1
        jal Function
        move    $s0, $v0

        lw  $a0, 4($sp)
        addi    $a0, $a0, -3
        jal Function


        lw  $a0, 4($sp)
        mul $t3, $a0, $s0
        sub $t4, $t3, $v0
        add $t5, $t4, $a0
        addi    $t6, $t5, -23

        move    $v0, $t6    

    Conclusion: 

        lw      $s1,0($sp)              # restore intermediate value
        lw  $a0,4($sp)
        lw  $ra,8($sp)

            addi    $sp,$sp,12              # restore stack

        jr  $ra             #return to caller```
...