def lcs3(a, b, c, an, bn, cn):
global arr
print(an,bn,cn,end=" ")
print(arr[an][bn][cn],end="/ ")
if arr[an][bn][cn] != None:
print ("Already here")
return arr[an][bn][cn]
if an == 0 or bn == 0 or cn == 0:
arr[an][bn][cn] = 0
print("One of 3 inputs is 0")
elif a[an-1] == b[bn-1] and b[bn-1] == c[cn-1]:
print("match!", an, bn, cn)
arr[an][bn][cn] = lcs3(a,b,c,an-1,bn-1,cn-1)+1
else:
print("Calculating")
arr[an][bn][cn] = max(lcs3(a,b,c,an-1,bn,cn),
lcs3(a,b,c,an,bn-1,cn),
lcs3(a,b,c,an,bn,cn-1))
return arr[an][bn][cn]
这是我通过将 3 个序列和序列的长度作为输入来计算最长公共(public)子序列的函数。该算法是自上而下的动态规划,函数外定义arr(尺寸为an+1,bn+1,cn+1的3维列表)
编辑:打印问题已经解决,但我得到的答案仍然不正确。 用于输入
5
8 3 2 1 7
7
8 2 1 3 8 10 7
6
6 8 3 1 4 7
我得到 2 个返回。
最佳答案
简单的回答:
如果 arr[an][bn][cn] != None:
返回 arr[an][bn][cn]
print("已经在arr")
您在第一个 if 语句中打印之前返回。
关于Python递归调用不执行代码 - 3个序列的子序列的最长公共(public),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51613093/