我试图在python中使用递归来实现这个函数,我有一个错误。我无法理解这是什么错误,你能帮助我吗?
代码:
def LongestCommonSubsequence(X,Y,tailX,tailY):
if tailX == tailY and tailX!='' and (X=='' or Y==''):
return len(tailX)
elif X=='' or Y=='':
return 0
else:
return max( LongestCommonSubsequence(X[1:],Y[1:],tailX+X[0],tailY+Y[0]),
LongestCommonSubsequence(X[1:],Y[1:],tailX+X[0],tailY),
LongestCommonSubsequence(X[1:],Y[1:],tailX,tailY+Y[0]),
LongestCommonSubsequence(X[1:],Y[1:],tailX,tailY))
X=raw_input()
Y=raw_input()
print LongestCommonSubsequence(X,Y,'','')
输入:
abccdabab
bacdbeb
预期产量:5
我得到了什么:4
答案 0 :(得分:2)
您似乎在尝试优化常见的尾部字符串;如果两个字符串以相同的尾部结尾,则确实可以跳过一些递归步骤。
但是你实际上并没有构建一个尾巴,而是在构建 head ,即开头的角色。
这是一个没有优化的工作递归llcs
:
def llcs(xstr, ystr):
if not xstr or not ystr:
return 0
x, xtail, y, ytail = xstr[0], xstr[1:], ystr[0], ystr[1:]
if x == y:
return 1 + llcs(xtail, ytail)
return max(llcs(xstr, ytail), llcs(xtail, ystr))
通过比较从xstr
或ystr
,而不是的开头删除字符所找到的长度,可以找到最长的公共子字符串长度。
您的代码明确地从未将X
与Y[1:]
或X[1:]
与Y
配对,以进行max()
调用,因此您永远不会为此找到LCS X
或Y
中的特定起始字符。
然后,您可以通过查看xtail
和ytail
(实际尾巴)尝试优化并提前纾困:
def llcs(xstr, ystr):
if not xstr or not ystr:
return 0
x, xtail, y, ytail = xstr[0], xstr[1:], ystr[0], ystr[1:]
if x == y:
if xtail == ytail:
# if the tails match, bail out early
return 1 + len(xtail)
return 1 + llcs(xtail, ytail)
return max(llcs(xstr, ytail), llcs(xtail, ystr))