2015-07-08 2 views
2

Итак, я понимаю логику расчета суммы цифр. Мне просто интересно, правильна ли эта рекурсивная функция. Предположим, что пользователь уже ввел номер, который он или она хочет получить цифру и хранится в $ v0.Сумма рекурсии Mips

Sum2: 
li $s0, 0 
move $a1, $v0 
li $s1, 0 
    li $s2, 10 
    # I am adjusting the stack frame size to store 3 words 
    addi $sp, $sp,-12 
    # These are the sum value, the return address, and the number 
    sw $s1, 0($sp) 
    sw $ra, 4($sp) 
    sw $a1, 8($sp) 
Loop2: bne $s0, $a1, SUM3 
    move $a0, $s1 
    li $v0, 1 
    syscall 
    lw $s1, 0($sp) 
    lw $ra, 4($sp) 
    lw $a1, 8($sp) 
    addi $sp, $sp 12 
    jr $ra 
SUM3: 

    div $t0, $a1, $s2 
    mfhi $t0 
    add $s1, $s1, $t0 
    div $t1, $a1, $s2 
    mflo $a1 
    j Loop2 

Если логика не ясно, что я имею в первую проверку, чтобы увидеть, если число не равно нулю, и если это не я, то получить модуль числа, деленной на 10 и добавить его в сумма, которая изначально равна 0, а затем делит вводный номер пользователя на 10 и продолжает вызывать функцию до тех пор, пока номер не станет нулевым. У меня также был один последний последний вопрос. В Mips рекурсивная функция или итеративная функция выполняются быстрее?

+0

_ «Мне просто интересно, правильная ли эта рекурсивная функция». _ Что происходит, когда вы запускаете ее? Это похоже на самый простой способ определить правильность реализации. Однако ваша реализация не выглядит рекурсивной для меня. – Michael

+0

Это работает, но я не был уверен, рекурсивный или нет. Я думал, что работа с указателем стека сделает его рекурсивным –

ответ

0

Ваша реализация соответствует что-то вроде этого:

int sum_digits(int n) { 
    int res = 0; 
    while (n != 0) { 
     res += n % 10; 
     n /= 10; 
    } 
    return res; 
} 

На самом деле вы просто напечатать результат, а не возвращать его, но это не относится к делу. Это явно итеративная функция.

рекурсивная реализация будет выглядеть примерно так:

int sum_digits(int n) { 
    return (n >= 10) ? ((n % 10) + sum_digits(n/10)) : (n % 10); 
} 

Я оставлю вас, чтобы перевести это в сборке MIPS теперь, когда вы знаете, что алгоритм выглядит следующим образом.

Смежные вопросы