【发布时间】:2013-08-09 02:59:12
【问题描述】:
“oneToEach”函数将List[Int] 的每个元素加1。第一个函数不是尾递归的,而后者是。
如果我将一百万长度的 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,它使用:+ 运算符,我知道read 是O(n) 复杂度。由于对列表中的每个递归/项目使用此运算符,最坏情况的算法复杂度是否变为 O(2*n)?
最后,对于百万元素的List,后一个函数是尾递归的,在资源方面表现会更好吗?
【问题讨论】:
标签: scala recursion tail-recursion