Functional programming 在kotlin中将命令根函数转换为函数样式

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

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

为了回答您的问题,以下是如何将
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
,这看起来很尴尬。