gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:52:18 26 4
gpt4 key购买 nike

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
}

最佳答案

这种方法类似于您的原始方法,除了不是从开始和前面递归递减直到到达最后并追加备份,我引入了一个累加器,我可以向后遍历列表,边走边积累。

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

关于scala - 如何使这个递归方法在 Scala 中尾递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10290189/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com