这可能是一个奇怪的问题,但......
问题: 如何将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)
答案 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)
}