为什么这不是尾递归?

3

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

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

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

2
我不是100%确定,但我认为尾调用必须在同一对象上。因此,tail.drop(n - 1)不是尾调用,因为它是在tail上调用的,而不是在this上调用的。 - marstran
1个回答

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接