为什么它不是尾递归?



我有以下代码,我不明白,为什么它不是尾递归:

override fun drop(n: Int): List<A> = if (n == 0) this else tail.drop(n - 1)

而这是一个尾递归:

fun drop(n: Int): List<A> {
tailrec fun drop(n: Int, list: List<A>): List<A> =
if (n <= 0) list else when (list) {
is Cons -> drop(n - 1, list.tail)
is Nil -> list
}
return drop(n, this)
}

为什么第一个示例不是尾递归?

这不是尾递归,因为 Kotlin 检查递归调用是否在同一个接收器上。在您的情况下,这是正确的;drop是一个虚函数(因为你使用override(,所以tail.drop可以有不同的实现。对于非open函数,存在 Tailrec 优化未应用于非 this 接收器上的尾递归调用的问题,但它似乎没有被积极处理。

还要注意此错误:对打开 tailrec 函数的递归调用生成不正确

最新更新