如何让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)
}
}
}