“oneToEach”函数将 a 的每个元素加 1 List[Int]
。第一个函数不是尾递归的,而后者是。
如果我将一百万长度的 List[Int] 传递给这两个函数,那么哪个函数的性能会更好?更好 = 更快或更少的资源使用。
// Add one to each element of a list
def oneToEach(l: List[Int]) : List[Int] =
l match {
case Nil => l
case x :: xs => (x + 1) :: oneToEach(xs)
}
...
def oneToEachTR(l: List[Int]) : List[Int] = {
def go(l: List[Int], acc: List[Int]) : List[Int] =
l match {
case Nil => acc
case x :: xs => go(xs, acc :+ (x + 1))
}
go(l, List[Int]())
}
如果我理解,第一个函数的算法复杂度为 O(n),因为有必要递归遍历列表的每个项目并加 1。
对于oneToEachTR
,它使用:+
运算符,我读过,它是 O(n) 复杂度。由于对列表中的每个递归/项目使用此运算符,最坏情况的算法复杂度是否变为 O(2*n)?
最后,对于百万元素列表,后一个函数是否会因为它是尾递归的而在资源方面表现更好?