нечетные значения для рекурсивной функции mips

#recursion #mips

#рекурсия #mips

Вопрос:

Может ли кто-нибудь подтолкнуть меня к этому в правильном направлении? Я пытаюсь воспроизвести эту функцию c в mips:

Я ожидаю, что возвращаемое значение будет сохранено в $ v0, и я выводю это значение после вызова функции. Функция прямо сейчас сохраняет 5 в $ v0, когда я вызываю функцию с помощью C(5, 2), которая, как я ожидаю, будет равна 13, а не 5.

 int C(int n, int k) {
   if (k == 0) {
      return 1;
   } else if (n == k){
      return 1;
   } else if (n < k){
      return 0;
   } else {
      return C(n, k-1)   C(n-1, k);
   }
}
 

и это ассемблерный код mips, который у меня есть

     c:
# $a0 = n, $a1 = k
    addi $sp, $sp, -12
    sw $ra, 0($sp)
    sw $s0, 4($sp)
    sw $s1, 8($sp)

    add $s0, $a0, $zero #s0 = n
    add $s1, $a1, $zero #s1 = k

    addi $t1, $zero, 1
    beq $s1, $zero, return1
    beq $s0, $s1, return1
    blt $s0, $s1, return0

    add $a0, $s0, $zero
    addi $a1, $s1, -1

    jal c

    add $s1, $zero, $v0 # $s1 = c(n,k-1)

    addi $a0, $s0, -1
    add $a1, $s1, $zero

    jal c #$v0 = c(n-1, k)

    add $v0, $v0, $s1

    exitc:

        lw $ra, 0($sp) #read from stack
        lw $s0, 4($sp)
        lw $s1, 8($sp)
        addi $sp, $sp, 12
        jr $ra

    return1:
        li $v0, 1
        j exitc
    return0:
        li $v0, 0
        j exitc
 

Ответ №1:

Вы захотите выполнить эти два add s в обратном порядке:

 add $s1, $zero, $v0 # $s1 = c(n,k-1)

addi $a0, $s0, -1
add $a1, $s1, $zero
 

В противном случае ваш второй звонок будет C(n-1, C(n,k-1)) вместо C(n-1, k) .