【发布时间】:2011-08-09 16:38:30
【问题描述】:
我编写了查找longest common subsequence (LCS) 的函数。例如,对于两个字符序列 BANANA 和 ATANA,它返回 AANA。实现是递归算法的幼稚低效适应,但与此问题的目的无关。
def LCS[T](a: Seq[T], b: Seq[T]): Seq[T] = {
if (a.isEmpty || b.isEmpty)
Seq.empty
else if (a.head == b.head)
a.head +: LCS(a.tail, b.tail)
else {
val case1 = LCS(a.tail, b)
val case2 = LCS(a, b.tail)
if (case1.length > case2.length) case1 else case2
}
}
我想以最通用的方式重构这个函数。当前实现适用于任何类型的输入序列,但总是返回 List[T] 类型的集合。我想实现以下行为:
LCS(List('B','A','N','A','N','A'), List('A','T','A','N','A' )) -> 列表('A','A','N','A') LCS(向量('B','A','N','A','N','A'),向量('A','T','A','N','A' )) -> 向量('A','A','N','A') ...对于所有其他 Seq 以此类推...如果 LCS 也能处理 Strings 和 Arrays 那就太好了:
LCS(“香蕉”,“ATANA”)->“AANA” LCS(数组('B','A','N','A','N','A'),数组('A','T','A','N','A' )) -> 数组('A','A','N','A')我相信在 Scala 2.8 通用集合库的帮助下,至少可以实现第一个要求。会很高兴看到“重型”机器,例如高级多态性、类型类、CanBuildFrom 等。
谢谢!
【问题讨论】:
-
虽然这不是完全的目标,但您应该能够按照stackoverflow.com/questions/5410846 的答案完成您想要的。但是,我建议您不要使用直接递归,因为您将不得不制作大量可笑的构建器来这样做。与构建器一起递归的辅助函数可以解决问题。
标签: generics scala types scala-collections generic-programming