根函数检查并遍历,直到它获得树中的根元素。
class NodeRoot(N: Int){
private val id: IntArray = IntArray(N)
init {
(0..N-1).forEach{ id[it] = it }
}
fun root(i: Int): Int {
var i = i
while (i != id[i]) i = id[i]
return i
}
}
答案 0 :(得分:4)
要回答您的问题,请按以下步骤重写root
以实现功能:
tailrec fun root(i: Int): Int = if (i == id[i]) i else root(id[i])
tailrec
关键字让编译器知道它应该将其编译为循环,这样可以避免由于递归而在堆栈上进行分配。
但是,我同意glee8e:可能有更好的方法来表达这一点。
您还可以避开init
块,只需将lambda传递给IntArray
即可初始化每个元素:
private val id: IntArray = IntArray(N) { it }