我正在this easy problem上练习基本的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 {
if (start >= end) return true
return cleaned[start] == cleaned[end] && isPalindrome(start+1, end-1)
}
return isPalindrome(0, cleaned.length-1)
}
}
我对tailrec
的理解是supposed将我的递归函数转换为迭代函数,这样就不会发生这种崩溃。如果我没有正确实现尾递归,则编译器应该发出错误。
有人可以向我解释为什么这会在大型输入上崩溃,就像标准的递归调用那样吗?
答案 0 :(得分:1)
在短路运算符中,此行为看起来像是missing optimization的尾部调用,其中最后一个操作数正在被求值的事实意味着表达式结果不再依赖于先前的操作数。
与此同时,您可以将您的return语句重写为
return if (cleaned[start] != cleaned[end]) false else isPalindrome(start+1, end-1)
获得相同的结果+尾部调用优化。