Рекурсия, также влияя на результат каждого рекурсивного вызова на ассемблере MIPS - PullRequest
0 голосов
/ 14 февраля 2019

В настоящее время я учусь на курсах по организации и дизайну компьютеров и пытаюсь понять MIPS весь семестр.Я пытаюсь преобразовать некоторый рекурсивный Java-код в MIPS, и мне было трудно связать его вместе.Моя главная проблема - это «вернуть 2 * Ханой (n-1) + 1».Я понимаю, как сделать часть Ханоя (n-1), но запутался, как умножить каждый вызов на 2 и добавить один.Вот мой код:

Java:

int Hanoi(int N) {
    if(N == 1)
        return 1;
    return 2 * Hanoi(N-1) + 1;
}

MIPS Перевод:

hanoi:     
  # Hanoi(n) -> Checks if n == 1
  subu $sp, $sp, 8
  sw   $ra, ($sp)
  sw   $s0, 4($sp)

  # Base Case
  li  $v0, 1
  beq $a0, $v0, to_other_case

  move $s0, $a0
  sub $a0, $a0, 1
  jal hanoi

  addi  $s1, $zero, 2
  mul $v0, $s0, $s1
  addi $v0, $v0, 1

  to_other_case:
            lw $ra, ($sp)
            lw $s0, 4($sp)
            addu $sp, $sp, 8
            jr $ra

Спасибо заранее за помощь!Я не обязательно ищу ответ, просто немного подтолкнуть в правильном направлении!

...