Nat*_*han 3 functional-programming scala tail-recursion
我找到了一个从Scala列表中创建笛卡尔积的函数.但是,它不是尾递归的,并且不适用于大型列表.不幸的是,我不知道在设计时需要合并多少列表,所以我相信递归函数是必要的.我正在努力使其尾递归,因此它可以由编译器优化:
def product[T](listOfLists: List[List[T]]): List[List[T]] = listOfLists match {
case Nil => List(List())
case xs :: xss => for (y <- xs; ys <- product(xss)) yield y :: ys
}
Run Code Online (Sandbox Code Playgroud)
这种方法类似于你原来的方法,除了不是开始和前面并递归下降,直到你到达结尾并追加,我已经引入了一个累加器,我可以向后跳过列表,累积为我走.
import annotation.tailrec
def product[T](listOfLists: List[List[T]]): List[List[T]] = {
@tailrec def innerProduct[T](listOfLists: List[List[T]], accum: List[List[T]]): List[List[T]] =
listOfLists match {
case Nil => accum
case xs :: xss => innerProduct(xss, for (y <- xs; a <- accum) yield y :: a)
}
innerProduct(listOfLists.reverse, List(Nil))
}
Run Code Online (Sandbox Code Playgroud)
然后:
scala> product(List(List(1,2),List(3,4)))
res0: List[List[Int]] = List(List(1, 3), List(1, 4), List(2, 3), List(2, 4))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1086 次 |
| 最近记录: |