Recursion 导致堆栈溢出的Kotlin tail递归函数
我当时正在练习basic Kotlin,在递归返回行中遇到了堆栈溢出,代码如下:Recursion 导致堆栈溢出的Kotlin tail递归函数,recursion,kotlin,tail-recursion,Recursion,Kotlin,Tail Recursion,我当时正在练习basic Kotlin,在递归返回行中遇到了堆栈溢出,代码如下: class Solution { fun isPalindrome(s: String): Boolean { val cleaned = s.toLowerCase().replace(Regex("[^a-z0-9]"), "") tailrec fun isPalindrome(start: Int, end: Int): Boolean { i
class Solution {
fun isPalindrome(s: String): Boolean {
val cleaned = s.toLowerCase().replace(Regex("[^a-z0-9]"), "")
tailrec fun isPalindrome(start: Int, end: Int): Boolean {
if (start >= end) return true
return cleaned[start] == cleaned[end] && isPalindrome(start+1, end-1)
}
return isPalindrome(0, cleaned.length-1)
}
}
我对tailrec
的理解是将递归函数转换为迭代函数,而迭代函数不会受到这种崩溃的影响。如果我没有正确实现尾部递归,编译器应该会发出错误
有人能解释一下为什么这会像标准递归调用一样在大输入上崩溃吗?这种行为看起来像短路运算符中的尾部调用,其中最后一个操作数正在求值这一事实意味着表达式结果不再依赖于前一个操作数 同时,您可以将返回语句重写为
return if (cleaned[start] != cleaned[end]) false else isPalindrome(start+1, end-1)
要获得相同的结果,请进行尾部调用优化。不确定短路是否算作尾部调用。啊,leetcode正在抑制警告,而编写非尾部递归的tailrec函数只会生成警告,而不是错误。我仍然好奇的是,
if(…)之间的区别是什么。。。else tailCall()
文档和中的示例在您的示例中,tailCall()
。就我所知没有什么不同。