我正在尝试在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)
答案 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 == 0
或n == 1
时,两者都是空子矩阵或标量的微不足道的情况子矩阵。
我想第一个块应该限制遍历主对角线上方的上三角形?然后只需翻转标志:
if j - i < 0:
return