#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)
.