gpt4 book ai didi

Kotlin - 为什么这个函数不适合尾递归?

转载 作者:行者123 更新时间:2023-12-02 13:03:19 25 4
gpt4 key购买 nike

函数send()在以下示例中递归调用自身:

internal inner class RouteSender(
val features: List<Feature>,
val exchange: GrpcUniExchange<Point, RouteSummary>
) {
var result: AsyncResult<RouteSummary>? = null // Set in stub for recordRoute.

fun send(numPoints: Int) {
result?.let {
// RPC completed or err'd before sending completed.
// Sending further requests won't error, but they will be thrown away.
return
}

val index = random.nextInt(features.size)
val point = features[index].location
println("Visiting point ${RouteGuideUtil.getLatitude(point)}, " +
"${RouteGuideUtil.getLongitude(point)}")
exchange.write(point)
if (numPoints > 0) {
vertx.setTimer(random.nextInt(1000) + 500L) { _ ->
send(numPoints - 1)
}
} else {
exchange.end()
}
}
}

可以重写它,以便执行的最后一个操作是对自身的递归调用:
...
if (numPoints <= 0) {
exchange.end()
} else {
vertx.setTimer(random.nextInt(1000) + 500L) { _ ->
send(numPoints - 1)
}
}
...

但是,如果我将其标记为 tailrec函数,我得到一个警告,递归调用不是尾调用。这不会停止程序成功运行的编译。但是,为什么这不是尾声?

documentation说:

To be eligible for the tailrec modifier, a function must call itself as the last operation it performs. You cannot use tail recursion when there is more code after the recursive call, and you cannot use it within try/catch/finally blocks.



这不在 try/catch/finally block 内,并且在递归调用之后没有更多代码。这意味着这个代码块没有资格进行尾递归优化是什么意思?

我会尝试回答我自己的问题,因为它没有返回值。基于 this讨论,我能想到的就这么多了。想法?

最佳答案

尽管您的方法似乎包含对自身的调用,但它实际上根本不是递归方法。

调用 send出现在闭包内。这意味着它不会立即被调用。只有在调用闭包本身时才会调用它。在您的情况下,这是由计时器完成的。它将发生在当前调用堆栈之外,甚至可能在当前线程之外。

无论如何,最后一次调用是对 vertx.setTimer 的调用。 .

关于Kotlin - 为什么这个函数不适合尾递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44811852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com