MIPS 汇编中的加泰罗尼亚数字

问题描述 投票:0回答:0

加泰罗尼亚数字由以下等式递归定义。 enter image description here

这是测试用例:

Program input:
0 1 2 3 6 9 
Expected output:
1 1 2 5 132 4862 
Obtained output:
1 1 2 4 32 256   

所以当n = 3时我的输出是错误的,输出应该是5而我的是4,等等。 这是我的代码:

catalan_recur:
addi $sp,$sp,-12
sw $ra,0($sp)
sw $s0,4($sp)
sw $a0,8($sp)
addi $t0,$0,1

bgt $a0,$t0,catalan_recur_else     #a0>1 ?
li $v0, 1
lw $s0, 4($sp)
lw $ra, 0($sp)
addiu $sp, $sp, 12
jr $ra

catalan_recur_else:
  li $t1,0         #res=0
  li $t2,0         #i=0
catalan_recur_loop:  
  bge $t2, $a0, end_loop  # if i >= n, exit loop
   # res += catalan_recur(i)*catalan_recur(n-i-1)
  move $a0, $t2              
  jal catalan_recur          # call catalan_recur(i)        
  add $s0,$0,$v0             # get return value and store in $s0
  lw $a0,8($sp)
  addi $t2,$t2,1             # i++
  sub $a0,$a0,$t2            # calculate n-i-1
  jal catalan_recur          # call catalan_recur(n-i-1)
  mult $s0,$s0,$v0           # catalan_recur(i) * catalan_recur(n-i-1)
  add $t1,$t1,$s0            # add to res
  lw $s0,4($sp)
  lw $a0,8($sp)
  j catalan_recur_loop  
        
end_loop:
  move $v0, $t1               # move res to $v0
  lw $a0,8($sp)
  lw $s0,4($sp)        
  lw $ra, 0($sp)
  addiu $sp, $sp, 12
jr $ra

伪代码:

def catalan_recur(n):
    if n <= 1:
        return 1;
    else:
        res = 0
        for i in range(n):  # i = 0 ~ (n-1)
            res += catalan_recur(i) * catalan_recur(n-i-1)
         return res;

>> a0: the argument for the given positive integer input, n

我知道我在catalan_recur_loop中出错了,加法一定漏掉了一些数字,但我不知道如何修复错误。

python c++ recursion mips catalan
© www.soinside.com 2019 - 2024. All rights reserved.