Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Recursion 导致堆栈溢出的Kotlin tail递归函数_Recursion_Kotlin_Tail Recursion - Fatal编程技术网

Recursion 导致堆栈溢出的Kotlin tail递归函数

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

我当时正在练习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 {
            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()
。就我所知没有什么不同。