最长公共子序列——我的无限循环在哪里?
Longest common subsequence—where is my infinite loop?
我正在尝试在 Ruby 中实现最长公共子序列算法,但收到 stack level too deep
错误消息。我知道这可能意味着我有一个无限循环,但我无法发现它。下面是我最好的尝试——我哪里出错了?
def lcs(string1, string2)
if !(string1.chars.any? { |x| string2.include?(x)})
return ""
elsif string1[-1] == string2[-1]
return lcs(string1[0..-2], string2[0..-2]) + string1[-1]
else
x = lcs(string1, string2[0..-1])
y = lcs(string1[0..-1], string2)
x.length > y.length ? x : y
end
end
n.b。我正在尝试 return 子序列本身,而不是它的长度。
尝试使用示例字符串:abcd
和 bc
并逐步执行。
你会发现这两行有问题:
x = lcs(string1, string2[0..-1])
y = lcs(string1[0..-1], string2)
因为 'abcd'[0..-1] -> 'abcd'
所以当它到达 x = ...
行时它就会卡住。
应该是[0..-2]
。
此外,您可以使用 if string1.chars.none? { |x| string2.include?(x)}
替换 if !(string1.chars.any? { |x| string2.include?(x)})
我正在尝试在 Ruby 中实现最长公共子序列算法,但收到 stack level too deep
错误消息。我知道这可能意味着我有一个无限循环,但我无法发现它。下面是我最好的尝试——我哪里出错了?
def lcs(string1, string2)
if !(string1.chars.any? { |x| string2.include?(x)})
return ""
elsif string1[-1] == string2[-1]
return lcs(string1[0..-2], string2[0..-2]) + string1[-1]
else
x = lcs(string1, string2[0..-1])
y = lcs(string1[0..-1], string2)
x.length > y.length ? x : y
end
end
n.b。我正在尝试 return 子序列本身,而不是它的长度。
尝试使用示例字符串:abcd
和 bc
并逐步执行。
你会发现这两行有问题:
x = lcs(string1, string2[0..-1])
y = lcs(string1[0..-1], string2)
因为 'abcd'[0..-1] -> 'abcd'
所以当它到达 x = ...
行时它就会卡住。
应该是[0..-2]
。
此外,您可以使用 if string1.chars.none? { |x| string2.include?(x)}
替换 if !(string1.chars.any? { |x| string2.include?(x)})