如何让kotlin实现这个BST比较函数是尾部递归的?

如何让kotlin实现这个BST比较函数是尾部递归的?,kotlin,Kotlin,这里是一个简单的二叉搜索树类 data class Bst<T: Comparable<T>>(var left: Bst<T>?, var value: T, var right: Bst<T>?) { tailrec fun contains(key: T): Boolean { return if (key < value) { left?.contains(key) ?: false

这里是一个简单的二叉搜索树类

data class Bst<T: Comparable<T>>(var left: Bst<T>?, var value: T, var right: Bst<T>?) {
    tailrec fun contains(key: T): Boolean {
        return if (key < value) {
            left?.contains(key) ?: false
        } else if (key > value) {
            right?.contains(key) ?: false
        } else {
            true
        }
    }
}
数据类Bst(变量左:Bst?,变量值:T,变量右:Bst?){
tailrec fun包含(键:T):布尔值{
返回if(键<值){
左?包含(键)?:假
}else if(键>值){
对吗?包含(键)?:false
}否则{
真的
}
}
}
不幸的是,当我将其粘贴到中时,它表示递归调用不是尾部递归的。如果我将
left?.contains
代码重构为一个If语句,该语句测试
left==null
,它会出现另一个错误,即
left
是如何可变的,并且自
If
语句以来可能发生了更改。在kotlin看来,我怎样才能使这些调用具有递归性?

如中所述:

要符合
tailrec
修饰符的条件,函数必须在执行最后一个操作时调用自身。当递归调用后有更多代码时,不能使用尾部递归,并且不能在try/catch/finally块中使用尾部递归

在这里,由于第一个再次调用函数本身的约束,您的实现已经失败。即使您调用了这个函数,它也在另一个实例中,并且不是这个块的最后一个操作

我能想到的最好办法就是在Kotlin上下文中“静态”实现它

数据类Bst(变量左:Bst?,变量值:T,变量右:Bst?){
fun contains(key:T)=contains(key,this)
伴星{
tailrec fun包含(键:T,bst:bst):布尔值{
如果(key==bst.value)返回true
val bst2=bst.run{if(key

另外,您应该考虑实现一个空值模式,而不是使用左、右空值。你可以利用这个

data class Bst<T: Comparable<T>>(var left: Bst<T>?, var value: T, var right: Bst<T>?) {
    fun contains(key: T) = contains(key, this)

    companion object {
        tailrec fun <T: Comparable<T>> contains(key: T, bst: Bst<T>): Boolean {
            if (key == bst.value) return true
            val bst2 = bst.run { if (key < value) left else right }
            if (bst2 == null) return false
            return contains(key, bst2)
        }
    }
}