为什么不是尾递归?

时间:2020-02-13 06:59:48

标签: recursion kotlin functional-programming

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

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

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

1 个答案:

答案 0 :(得分:3)

这不是尾递归,因为Kotlin会检查递归调用在同一接收者上。就您而言,这是正确的; drop是一个虚函数(因为您使用了override),因此tail.drop可以有不同的实现。对于非open函数,存在问题Tailrec optimization not being applied to tail recursive calls on a non-this receiver,但似乎并未积极解决。

还要注意此错误:Recursive calls to open tailrec functions are generated incorrectly