Mips递归数字总和

时间:2015-07-08 21:10:48

标签: recursion mips

所以我理解了如何计算数字总和的逻辑。我只是想知道这个递归函数是否正确。假设用户已输入他或她想要数字总和的数字并存储在$ v0中。

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中,递归函数或迭代函数执行得更快吗?

2 个答案:

答案 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程序集。

答案 1 :(得分:0)

正确实现递归以进行数字求和:

.data
    n: .word 1965
    s: .word 0
.text

main:

    lw $t0,n
    addi $t1,$zero,10
    add $t4,$zero,$zero     #the result

recursion:

    div $t0,$t1             #n/10 and n%10
    mflo $t0                #n=n/10
    mfhi $t3                #digit=n%10
    add $t4,$t4,$t3         #s=s+digit
    bne $t0,$zero,recursion #if n!=0

end:

    sw $t4,s
    li $v0,10
    syscall