所以我理解了如何计算数字总和的逻辑。我只是想知道这个递归函数是否正确。假设用户已输入他或她想要数字总和的数字并存储在$ 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中,递归函数或迭代函数执行得更快吗?
答案 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