矩阵无法正常工作的自定义回溯功能

时间:2017-11-23 19:26:08

标签: python algorithm matrix

我正在尝试在Python 3中实现用于RNA折叠的Nussinov算法。

到目前为止,我有正确的矩阵,我正在尝试traceback通过这个矩阵。

本质上,函数应该从矩阵的右上角开始,然后根据算法继续遍历单元格,直到达到对角线。

更改structure列表没有任何问题。 谁能告诉我为什么?

structure = list()

for base in seq:
    structure.append('.')

def traceback(i, j, matrix1):
    if j - i > 0:
       return

    elif matrix1[i][j] == matrix1[i+1][j]: # if value same as cell under i,j
        traceback(i+1, j, matrix1)

    elif matrix1[i][j] == matrix1[i][j-1]: # if value same as cell on left of i,j
        traceback(i, j-1, matrix1)

    elif matrix1[i][j] == (matrix1[i+1][j-1] + 1):
        traceback(i+1, j-1, matrix1)
        structure[i] = '('
        structure[j] = ')'

print(matrix1)
traceback(0, n-1, matrix1)

1 个答案:

答案 0 :(得分:1)

您的矩阵不会发生任何事情,因为您的第一次if-check将始终执行早期返回:

def traceback(i, j, matrix1):
    if j - i > 0:
        return
    ...

traceback(0, n-1, matrix1)

要超越第一次返回,j应该小于i,对吧?现在观察你的输入:

   (n - 1) - 0 <= 0
=> n - 1 <= 0
=> n <= 1

因此,在当前状态下,traceback函数将执行矩阵元素检查当且仅当n == 0n == 1时,两者都是空子矩阵或标量的微不足道的情况子矩阵。

我想第一个块应该限制遍历主对角线上方的上三角形?然后只需翻转标志:

if j - i < 0:
    return