튜플을 만들 필요가 없기 때문에 (s1,s2).zipped
을 (s1 zip s2)
보다 약간 더 효율적으로 사용할 수 있습니다. 대신 두 개의 인수를 취하는 함수를 만듭니다.
더 나은 효율을 아직 하지만, 사용하지 않을의 용이성 사용자 지정 전문 문자열 폴더를 정의하는 것입니다, 당신이 가장 긴 공통 접두어의 길이를 찾으려면 지금
abstract class StrFold[@specialized T](var result: T) {
def apply(c1: Char, c2: Char): Unit
def done: Boolean
}
def strfold[@specialized T](s1: String, s2: String)(folder: StrFold[T]): T = {
var i = 0
val L = math.min(s1.length, s2.length)
while (i < L) {
folder(s1.charAt(i), s2.charAt(i))
if (folder.done) return folder.result
i += 1
}
folder.result
}
당신
class LcpFind extends StrFold(0) {
var done = false
def apply(c1: Char, c2: Char) { if (c1 == c2) result += 1 else done = true }
}
def lcp(s1: String, s2: String) = strfold(s1,s2)(new LcpFind)
fold-with-escape 절없이 LCP를 계산하기 위해 명령형 또는 재귀 적 기능 코드를 작성하는 것만큼이나 논란의 여지가 있습니다.
그러나 매번 저급 문자열을 수작업으로 작성하는 것만 큼 빨라야합니다. (벌금은 (작은) LcpFind
개체를 매번 생성해야하며, 호출간에 result
을 0으로 재설정하여 다시 사용하거나 StrFold
및 strfold
을 구현하여 reset
메서드를 호출하고 호출 할 수 있습니다. 입력 매개 변수는 zero
이며 별도의 result
메서드가 있습니다.