【发布时间】:2019-04-10 16:35:25
【问题描述】:
我需要通过索引的奇数和偶数将列表分组为两个列表,从 1 开始,而不是 0。我认为无限递归有问题,因为执行第二个函数的时间太多了而且我的笔记本电脑会去火星。
第一个简单递归的函数可以正常工作,但是第二个,merge2,尾递归让我的电脑崩溃了。
代码如下:
// Simple recursion
def merge1(listA: List[String], listB: List[String]): List[String] = (listA, listB) match {
case (Nil, Nil) => Nil
case (head1 :: tail1, Nil) => head1 :: merge1(tail1, Nil)
case (Nil, head2 :: tail2) => head2 :: merge1(Nil, tail2)
case (head1 :: tail1, head2 :: tail2) => head1 + head2 :: merge1(tail1, tail2)
}
merge1 (List("a", "b", "c", "d"), List("e", "f", "g", "h", "i", "j"));
// Tail recursion
def merge2 (listA1: List[String], listB1: List[String]): List[String] = {
def merge2Helper(listA: List[String], listB: List[String], listACC: List[String]): List[String] =
(listA, listB) match {
case (Nil, Nil) => listACC
case (head1 :: tail1, Nil) => merge2Helper(tail1, listB, listACC ::: List(head1))
case (Nil, head2 :: tail2) => merge2Helper(tail2, listB, listACC ::: List(head2))
case (head1 :: tail1, head2 :: tail2) => merge2Helper(tail1, tail2, listACC ::: List(head1 + head2))
}
merge2Helper(listA1, listB1, Nil)
}
merge2 (List("a", "b", "c", "d"), List("e", "f", "g", "h", "i", "j"));
【问题讨论】:
-
使用
@annotation.tailrec -
第三种情况不应该是:
case (Nil, head2 :: tail2) => merge2Helper(listA, tail2, listACC ::: List(head2))? -
第三个模式匹配案例
case (Nil, head2 :: tail2) => merge2Helper(tail2, listB, listACC ::: List(head2))不应该是case (Nil, head2 :: tail2) => merge2Helper(listA, tail2, listACC ::: List(head2))吗?
标签: scala function functional-programming