我found a function用于从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
}
答案 0 :(得分:5)
这种方法类似于你原来的方法,除了不是起始和前面并递归下降直到你到达结尾并追加,我已经引入了一个累加器,我可以向后跳过列表,随着我的积累。
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))
}
然后:
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))