【发布时间】:2021-07-11 20:18:05
【问题描述】:
假设我有一个递归函数,它是尾递归。不知道这个函数会是递归实现,在栈上增长,还是改成循环(因为是尾递归函数)?
我刚刚读到 Scala 会检测到此类调用并对其进行优化,但这是仅限 Scala 的东西还是一般的 JVM?
【问题讨论】:
-
我很确定这个函数不是尾递归的。在对 sum() 的嵌套调用之后,仍然需要在该调用的返回值中添加一些内容。
-
这不是尾声。
-
不管怎样,HotSpot 不支持 TCO:stackoverflow.com/q/3616483/139010
-
创建一个 subList 对象比递归更昂贵(假设你已经用完堆栈)当然最有效的选择是简单的迭代。
-
鉴于您对这种编程风格感兴趣,您是否有理由不能只使用 Scala?以上(整个)的等价物将是
println((0 to 5).sum)。如果您考虑使用 sum() 方法作弊,您可以使用折叠生成总和:(0 /: (0 to 5))(_+_)。作为一种方法,上面的一个更通用的版本是def sum( xs:Seq[Int] ):Int = if (xs.isEmpty) 0 else xs.head + sum(xs.tail)。或者您可以编写一个尾递归版本,它实际上会得到优化(通过 scalac)。
标签: java scala optimization recursion jvm