1
我似乎無法找到我的錯在我的算法,我的具體問題是,我似乎打印相同的值,在控制檯輸入的所有整數:這裏是我的代碼ASM語言:因子算法錯誤?
main:
li $v0, 5
syscall
jal factorial
li $v0, 10
syscall
factorial:
###preamble###
subu $sp, $sp, 32
sw $ra, 28($sp)
sw $fp, 24($sp)
addu $fp, $sp, 32
sw $a0, 20($fp)
###preamble###
lw $v0, 20($fp)
bgtz $v0, multiply
li $v0, 1
j end
multiply:
lw $v1, 20($fp)
subu $v0, $v1, 1
move $a0, $v0
jal factorial
lw $v1, 20($fp)
li $t3, 0
li $t2, 1
b multi
multi:
beq $t2, $v0, endLOOP
add $t3, $t3, $v1
add $t2, $t2, 1
b multi
endLOOP:
move $v0, $t3
end:
lw $ra, 28($sp)
lw $fp, 24($sp)
addu $sp, $sp, 32
move $a0, $v0
li $v0, 1
syscall
jr $ra
在這代碼我似乎總是要打印的值爲10,而在我的第二個代碼,我總是得到一個11
main:
li $v0, 5
syscall
jal factorial
li $v0, 10
syscall
factorial:
###preamble###
subu $sp, $sp, 32
sw $ra, 28($sp)
sw $a0, 24($sp)
li $v0, 1
ble $a0, $zero, end
b multiply
###preamble###
multiply:
addi $a0, $a0, -1
jal factorial
lw $a0, 24($sp)
b multi
multi:
beq $t2, $v0, endLOOP
add $t3, $t3, $a0
add $t2, $t2, 1
b multi
endLOOP:
move $v0, $t3
end:
lw $ra, 28($sp)
addu $sp, $sp, 32
move $a0, $v0
li $v0, 1
syscall
jr $ra
也請注意,我們不允許使用MULT功能,所以請不要問我爲什麼不使用它。謝謝您的幫助:d
我得到你的答案的第一部分,我的問題,但對第二個,我不太明白。但爲了讓我和你的事情變得更加容易,我只會問我如何在控制檯中打印factorial的最終值?我不太確定如何去做 –
_「第二個,我不太明白」_:我在說你用值1覆蓋了返回值,這樣當你按照你的方式工作時通過遞歸鏈返回「out」,無論「n」是什麼,'factorial(n)'總是會從'factorial(n-1)'得到值1。我建議你在將_first_調用到'factorial'之後(即在'exit'' syscall'之前)移動print。 (我現在談論你的第一個實現,我沒有看第二個版本) – Michael
哦,我明白了。該程序現在工作正常。感謝您的幫助! :d –