我有以下代码,但我不明白为什么它不是尾递归:
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)
}
为什么第一个例子不是尾递归呢?
tail.drop(n - 1)
不是尾调用,因为它是在tail
上调用的,而不是在this
上调用的。 - marstran