将命令式根函数转换为kotlin中的函数式

时间:2017-05-07 14:30:48

标签: functional-programming 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
    }
}

1 个答案:

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