如果函数中的最后一个语句是func(x,tailList):
def func(x:Int):List[Int]...
case head :: tailList => head :: func(x,tailList)
将此函数转换为尾递归需要将累加器添加为第三个参数(并保持干净,在func()中添加局部函数)。
insertTail(x,tailList,head::acc)
似乎无法正常工作。不应该" acc"保持正在进行的计算?
我是否在这里遗漏了一些内容,以便使用累加器进行尾递归工作?
添加更完整的示例
def funcTailTest(x:Int,xs:List[Int]):List[Int] = {
@tailrec
def inner(x:Int,xs:List[Int],acc:List[Int]) : List[Int] = xs match {
case head::tailList => {
inner(x,tailList,head::acc)
}
}
inner(x,xs,Nil)
}
基本上应该将head添加到inner()函数的输出中,这样w / o试图使其尾递归最后一个语句在一个案例中会看起来
head::inner(x,tailList)
答案 0 :(得分:2)
以下是使用cons运算符
实现Tail递归的scala函数def reverseUtility(ele: List[Int], res: List[Int]):List[Int] ={
ele match {
case Nil => Nil
case x :: Nil => x :: res
case x :: y => reverseUtility(y, (x::res))
}}
传递一个Int
列表和一个名为res(result)
的空列表作为该函数的参数。函数的时间复杂度为O(N)
答案 1 :(得分:1)
假设反向也是尾递归实现的(它肯定可以),以下是尾递归附加:
def append[T](y: T, xs: List[T]): List[T] = {
@tailrec
def appendAcc[T](y: T, xs: List[T], acc: List[T]): List[T] = xs match {
case Nil => y :: acc
case x :: xs => appendAcc(y, xs, x :: acc)
}
appendAcc(y, xs, Nil).reverse
}