gpt4 book ai didi

recursion - Kotlin递归堆栈溢出

转载 作者:行者123 更新时间:2023-12-02 06:48:33 25 4
gpt4 key购买 nike

我在Kotlin中编写了此递归函数:

fun recursive(target: String, population: Population, debugFun: (String) -> Unit) : Population {
if (population.solution(target).toString() == target) {
return population
}
debugFun.invoke(population.solution(target).toString())
return recursive(target, population.evolve(target), debugFun)
}

它将运行不确定的时间(因为我正在使用随机性来收敛进化算法中的解)。我经常遇到堆栈溢出。 Kotlin / JVM语言的最大堆栈深度是多少?我应该以非递归方式编写函数吗?

最佳答案

tailrec关键字告诉Kotlin编译器使用尾部递归。因此,它将展开递归循环到循环中,这样您就摆脱了StackOverflowError。

tailrec fun recursive(target: String, population: Population, debugFun: (String) -> Unit) : Population {
if (population.solution(target).toString() == target) {
return population
}
debugFun.invoke(population.solution(target).toString())
return recursive(target, population.evolve(target), debugFun)
}

因此,在使用tailrec时,编译器会创建与以下功能匹配的内容:
fun recursive(target: String, population: Population, debugFun: (String) -> Unit) : Population{
var tmp = population

while (true) {
if (tmp.solution(target).toString() == target) {
return tmp
}
debugFun.invoke(population.solution(target).toString())
tmp = tmp.evolve(target)
}
}

在此函数中,不再进行任何方法调用,因此没有任何内容被压入堆栈,因此我们从StackOverflowError中保存。

请注意,我们仍然会陷入无尽的循环!

关于recursion - Kotlin递归堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51004877/

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