在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 }