Scala Tail递归到非尾递归

时间:2017-10-06 05:05:12

标签: scala recursion

这可能是一个奇怪的问题,但......

问题: 如何将Scala中的尾递归函数转换为非尾递归解决方案?

注意:我知道尾部递归解决方案在Scala中很棒,但我被要求将其更改为非尾递归解决方案。我不知道该怎么做

我在这里有一个尾递归解决方案的代码(至少我希望它的尾递归lol)

def cubesTailRecur(a: List[Int], acc: List[Int] = List.empty): List[Int] = {
      a match {
        case Nil => acc
        case h :: t if (h%2 == 0) => cubesTailRecur(t, acc)
        case h :: t  => cubesTailRecur(t, acc :+ Math.pow(h, 3).toInt)
      }
    }

我的函数所做的是迭代给定的整数列表,并返回一个包含所有奇数的立方体的新数组。

示例:

    println(cubesTailRecur(List(1, 2, 3, 4, 5, 6, 7)))

    // OUTPUT
    // List(1, 27, 125, 343)

1 个答案:

答案 0 :(得分:4)

尾递归是一种递归形式,其中递归调用是最后一条指令。不使尾部递归会意味着你需要用递归调用的结果做一些其他的计算。

在您的情况下,您可以删除acc / accumulator参数并通过递归堆栈执行累积。以下几行,

def cubesRec(a: List[Int]): List[Int] = a match {
  case Nil => List[Int]()
  case h::t if (h%2 == 0) => cubesRec(t)
  case h::t => Math.pow(h,3).toInt :: cubesRec(t)
}