Tail递归cons运算符Scala

时间:2012-07-25 13:45:46

标签: scala tail

如果函数中的最后一个语句是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)

2 个答案:

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