我編寫了查找longest common subsequence(LCS)的函數。例如,對於字符BANANA和ATANA的兩個序列,它返回AANA。實現是遞歸算法的天真無效的適應,但這與這個問題的目的無關。以通用方式對Scala集合進行操作
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')) -> List('A','A','N','A') LCS(Vector('B','A','N','A','N','A'), Vector('A','T','A','N','A')) -> Vector('A','A','N','A') ...and so on for all other Seqs...
這將是美好的,如果LCS還可以處理字符串 S和陣列 S:
LCS("BANANA", "ATANA") -> "AANA" LCS(Array('B','A','N','A','N','A'), Array('A','T','A','N','A')) -> Array('A','A','N','A')
相信使用Scala 2.8泛型集合庫的幫助至少可以達到第一個要求。很高興看到「重型」機器,如更高級的多態,類型類,CanBuildFrom等等。
謝謝!
雖然這不是*完全*目標,你應該能夠通過遵循http://stackoverflow.com/questions/5410846的答案來完成你想要的。我建議你不要使用簡單的遞歸,但是,因爲你必須讓一些荒謬的建設者這樣做。與建設者一起遞歸的幫助函數可以解決這個問題。 – 2011-04-20 17:39:10