【发布时间】:2017-11-14 08:54:04
【问题描述】:
这是Scala 中的函数式编程中的一个练习。
实现 hasSubsequence for 检查一个 List 是否包含另一个 List 作为子序列。例如, List(1,2,3,4) 将具有 List(1,2)、List(2,3) 和 List(4) 作为 子序列等。
我的第一次尝试如下:
def go[A](l: List[A], sub:List[A]): Boolean =
(l, sub) match {
case (_,Nil) => true
case (Nil,_) => false
case (a :: as, x :: xs) if a == x => go(as, xs)
case (a :: as, _) => go(as, sub)
} //> go: [A](l: List[A], sub: List[A])Boolean
go(List(1,2,0), List(1,0)) //> res6: Boolean = true
这是错误的,因为在递归中,初始 sub 输入没有被存储(或未被识别),而是在每次调用时被替换。
但是,如果我将该函数用作辅助函数
def hasSubsequence[A](l: List[A], sub: List[A]): Boolean ={
def go[A](l: List[A], a:List[A]): Boolean =
(l, a) match {
case (_,Nil) => true
case (Nil,_) => false
case (a :: as, x :: xs) if a == x => go(as, xs)
case (a :: as, _) => go(as, sub)
}
go(l,sub)
} //> hasSubsequence: [A](l: List[A], sub: List[A])Boolean
hasSubsequence(List(1,2,0), List(1,0)) //> res5: Boolean = false
然后它被存储为一个值并且工作正常。问题是,如果我不想要任何辅助函数,有没有办法做到这一点?
更新:每@jwvh 第二个需要更正如下。
def hasSubsequence[A](l: List[A], sub: List[A]): Boolean ={
def go[A](l: List[A], a:List[A]): Boolean =
(l, a) match {
case (_,Nil) => true
case (Nil,_) => false
case (a :: as, x :: xs) if a == x => go(as, xs)
case (a :: as, _) if a == sub.head => go(a::as, sub)
case (a :: as, _) => go(as,sub)
}
go(l,sub)
} //> hasSubsequence: [A](l: List[A], sub: List[A])Boolean
hasSubsequence(List(1,2,0), List(1,0)) //> res0: Boolean = false
hasSubsequence(List(1,1,2,0), List(1,2)) //> res1: Boolean = true
【问题讨论】:
-
第三个参数?
标签: scala recursion pattern-matching