如何使这个递归方法在Scala中递归递归?

时间:2012-04-24 00:30:05

标签: scala functional-programming tail-recursion

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
}

1 个答案:

答案 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))