在kotlin中将命令式的根函数转化为函数式
根函数检查并遍历,直到获得树中的根元素。
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 } }
为了回答你的问题,下面是你可以重写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 }