Functional programming 在kotlin中将命令根函数转换为函数样式
root函数检查并遍历,直到在树中获得根元素Functional programming 在kotlin中将命令根函数转换为函数样式,functional-programming,kotlin,Functional Programming,Kotlin,root函数检查并遍历,直到在树中获得根元素 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
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
关键字让编译器知道应该将其编译成循环,从而避免由于递归而在堆栈上分配
然而,我同意:也许有更好的方式来表达这一点
您还可以避免init
块,只需将lambda传递给IntArray
即可初始化每个元素:
private val id: IntArray = IntArray(N) { it }
为了回答您的问题,以下是如何将
root
重写为功能性的:
tailrec fun root(i: Int): Int = if (i == id[i]) i else root(id[i])
tailrec
关键字让编译器知道应该将其编译成循环,从而避免由于递归而在堆栈上分配
然而,我同意:也许有更好的方式来表达这一点
您还可以避免init
块,只需将lambda传递给IntArray
即可初始化每个元素:
private val id: IntArray = IntArray(N) { it }
当(i!=id[i])i=id[i]时,您确定使用
?考虑到id数组只是0..N-1
,这看起来很尴尬。您确定使用而(i!=id[i])i=id[i]
?考虑到id数组只是0..N-1
,这看起来很尴尬。