MIPS汇编实现组合数n choose k代码异常求助:输入2和3输出4
MIPS汇编组合数代码错误排查与修复
你的代码存在两个关键错误,导致输入n=2、k=3时输出错误结果:
错误1:n < k时未返回0
组合数定义中,当n < k时结果为0,但你的代码在判断n < k后直接跳转到choose_end,未对返回寄存器$v0赋值。此时$v0保留的是之前操作的残留值(比如输入k=3时的syscall返回值或栈中随机值),这就是输出4的原因。
错误2:计算C(n-1, k)时参数错误
调用完C(n-1, k-1)后,你仅将$a0加1恢复为n-1,但$a1仍保持为k-1(递归调用C(n-1,k-1)时修改后的值),实际应该恢复为原始的k值,否则会错误调用C(n-1, k-1)而非C(n-1, k),导致递归计算完全偏离预期。
修正后的代码:
.text addi $v0, $zero, 5 syscall add $a0, $v0, $zero addi $v0, $zero, 5 syscall add $a1, $v0, $zero #call choose function jal choose add $a0, $v0, $zero #print result addi $v0, $zero, 1 syscall addi $v0, $zero, 10 #exit program syscall choose: addi $sp, $sp, -16 sw $ra, 0($sp) # save the return address on the stack sw $s0, 4($sp) # save s0 on the stack sw $a0, 8($sp) # save n on the stack sw $a1, 12($sp) # save k on the stack slt $t0, $a0, $a1 # check if n < k beq $t0, $1, choose_zero beq $a0, $0, choose_one # check if n == 0 or k == 0 beq $a1, $0, choose_one addi $a0, $a0, -1 # calculate choose(n-1, k-1) addi $a1, $a1, -1 jal choose move $s0, $v0 # 恢复原始n和k,计算choose(n-1, k) lw $a0, 8($sp) lw $a1, 12($sp) addi $a0, $a0, -1 jal choose add $v0, $s0, $v0 # add val1 and val2 j choose_end choose_one: li $v0, 1 # return 1 j choose_end choose_zero: li $v0, 0 # return 0 when n < k j choose_end choose_end: lw $ra, 0($sp) # restore the return address lw $s0, 4($sp) # restore s0 addi $sp, $sp, 16 # deallocate space from stack jr $ra # return to caller
内容的提问来源于stack exchange,提问作者narutobaco
相关产品推荐
相关产品推荐

