Scala尾部递归到非尾部递归

Scala尾部递归到非尾部递归,scala,recursion,Scala,Recursion,这可能是个奇怪的问题,但是 问题: 如何将Scala中的尾部递归函数转换为非尾部递归解决方案 注意:我知道尾部递归解决方案在Scala中非常好,但我被要求将其更改为非尾部递归解决方案。我不知道该怎么做 我这里有一个尾部递归解决方案的代码(至少我希望是尾部递归lol) 我的函数所做的是遍历给定的整数列表,并返回一个包含所有奇数立方体的新数组 示例: println(cubesTailRecur(List(1, 2, 3, 4, 5, 6, 7))) // OUTPUT /

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

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

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

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

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

示例:

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

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

尾部递归是递归的一种形式,其中递归调用是最后一条指令。若不使某些尾部递归,则意味着您需要对递归调用的结果进行其他计算

在您的情况下,您可以删除
acc
/acculator参数,并通过递归堆栈执行累加。大致如下:

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)
}

尾部递归是递归的一种形式,其中递归调用是最后一条指令。若不使某些尾部递归,则意味着您需要对递归调用的结果进行其他计算

在您的情况下,您可以删除
acc
/acculator参数,并通过递归堆栈执行累加。大致如下:

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)
}

这是可行的,但有一个问题。它以相反的顺序打印列表。例如:列表(1,27,125,343)与列表(343,125,27,1)我如何反转它?编辑:如何在函数中反转它。我知道如何在打印时反转。您可以使用
Math.pow(h,3).toInt
预先编写
Math.pow(h,3).toInt::cubesRec(t)
快速问题:为什么要使用
+:
这两个预先编写。我刚刚测试了两个
,也称为cons,它仅为list定义,其中as
+:
是为
Seq
定义的,后者是位泛型的。看一看,更好地理解这部作品,但有一个问题。它以相反的顺序打印列表。例如:列表(1,27,125,343)与列表(343,125,27,1)我如何反转它?编辑:如何在函数中反转它。我知道如何在打印时反转。您可以使用
Math.pow(h,3).toInt
预先编写
Math.pow(h,3).toInt::cubesRec(t)
快速问题:为什么要使用
+:
这两个预先编写。我刚刚测试了两个
,也称为cons,它仅为list定义,其中as
+:
是为
Seq
定义的,后者是位泛型的。看一看,以便更好地理解