【问题标题】:Longest common subsequence—where is my infinite loop?最长公共子序列——我的无限循环在哪里?
【发布时间】:2017-03-31 01:09:28
【问题描述】:

我正在尝试在 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.我试图返回子序列本身,而不是它的长度。

【问题讨论】:

标签: ruby algorithm subsequence


【解决方案1】:

尝试使用示例字符串:abcdbc 并逐步执行。

你会发现这两行有问题:

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)})

【讨论】:

  • 当然!谢谢何文,不知道我是怎么错过的。
猜你喜欢
  • 2011-03-01
  • 2011-02-25
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
相关资源
最近更新 更多