繁体   English   中英

递归显示在 python 中查找最长公共子序列的错误

[英]Recursion showing error for finding longest common sub-sequence in python

这是ideone链接 我想通过动态编程解决著名的 lcs 问题,但无法解决这个错误。 当我运行这个 function 时,它说如下:

TypeError:+ 不支持的操作数类型:“NoneType”和“int”

a = "ABCBDABA"
b = "BDCABAD"
d = dict()
def lcs(m, n):
    if m == 0 or n == 0:
        return 0
    key = str(m) + "|" + str(n)
    if key not in d.keys():
        #print(key)           
        if a[m - 1] == b[n - 1]:
            d[key] = lcs(m - 1, n - 1) + 1
        else:
            d[key] = max(lcs(m - 1, n), lcs(m, n - 1))
    else:
        return d[key]

lcs(len(a), len(b))
print(d)

错误发生在哪一行? 我猜是这条线

d[key] = lcs(m - 1, n - 1) + 1

因为错误是说您要添加两个对象,一个是int类型,另一个是没有指定类型( Python 调用NoneType )。 这意味着当你给它输入m - 1n - 1时,你的lcs function 没有返回任何东西。 发生这种情况是因为 function 中唯一的return语句出现在最外面的else条件中。

也就是说,你需要你的 function 返回一些东西,也许是一个 integer,当键str(m) + "|" + str(n) str(m) + "|" + str(n)不在字典中。

不知道是不是你要找的output,不过我加了return语句:

a = "ABCBDABA"
b = "BDCABAD"
d = dict()
def lcs(m, n):
    if m == 0 or n == 0:
        return 0
    key = str(m) + "|" + str(n)
    if key not in d.keys():
        #print(key)           
        if a[m - 1] == b[n - 1]:
            d[key] = lcs(m - 1, n - 1) + 1
        else:
            d[key] = max(lcs(m - 1, n), lcs(m, n - 1))
        return d[key]
    else:
        return d[key]

lcs(len(a), len(b))
print(d)

现在上面的代码在运行时返回:

{'1|6': 1, '1|4': 1, '2|5': 2, '2|6': 2, '1|1': 0, '1|2': 0, '1|3': 0, '2|1': 1, '2|2': 1, '2|3': 1, '2|4': 1, '3|3': 2, '3|4': 2, '3|5': 2, '3|6': 2, '4|5': 3, '4|6': 3, '5|7': 4, '3|1': 1, '3|2': 1, '4|1': 1, '4|2': 1, '4|3': 2, '4|4': 2, '5|2': 2, '5|3': 2, '5|4': 2, '5|5': 3, '6|6': 4, '6|7': 4, '6|4': 3, '7|5': 4, '7|6': 4, '7|7': 4, '8|6': 5, '8|7': 5}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM