【发布时间】:2026-01-30 18:35:01
【问题描述】:
在我的 Scala 应用程序中,我有一个函数调用一个返回 Future[T] 类型结果的函数。我需要在我的递归函数调用中传递映射结果。我希望这是尾递归,但地图(或 flatMap)正在破坏这样做的能力。我收到一个错误“递归调用不在尾部位置。”
以下是此场景的一个简单示例。如何修改这使得调用将是尾递归的(不破坏带有 Await.result() 的 Futures 的好处)?
import scala.annotation.tailrec
import scala.concurrent.{Await, Future}
import scala.concurrent.duration._
implicit val ec = scala.concurrent.ExecutionContext.global
object FactorialCalc {
def factorial(n: Int): Future[Int] = {
@tailrec
def factorialAcc(acc: Int, n: Int): Future[Int] = {
if (n <= 1) {
Future.successful(acc)
} else {
val fNum = getFutureNumber(n)
fNum.flatMap(num => factorialAcc(num * acc, num - 1))
}
}
factorialAcc(1, n)
}
protected def getFutureNumber(n: Int) : Future[Int] = Future.successful(n)
}
Await.result(FactorialCalc.factorial(4), 5.seconds)
【问题讨论】:
标签: scala dictionary recursion future tail