将过程样式方法转换为功能样式

时间:2017-10-14 19:28:06

标签: functional-programming kotlin

下面的代码应该通过遍历从红色黑树的根到底部的左节点来计算黑色节点。黑色节点的数量存储在变量black

fun isBalanced1(): Boolean {
    require(!isEmpty()) { "Cannot check empty tree for balance"}
    var x = root
    var black = 0
    while(x != null) {
        if(!isRed(x)) {
            black++
        }
        x = x.left
    }
    return isBalanced(root, black)
}

样式是程序性的,它可以正常工作。

现在,改变如何以更具功能性的方式做同样的事情?

这就是我提出的:

fun isBalanced1(): Boolean {
    require(!isEmpty()) { "Cannot check empty tree for balance" }
    val black =
            generateSequence(root) { node -> node.left }
                    .takeWhile { node -> node != null }
                    .filter { node -> !isRed(node) }.count()
    return isBalanced(root, black)
}

它使用序列生成器遍历树,而节点不是null,然后过滤黑色的并计算所有匹配。

这是转换此树遍历代码的正确方法还是在Kotlin中有更好的替代方法?

1 个答案:

答案 0 :(得分:0)

遵循评论中给出的建议,这就是代码的样子:

fun isBalanced(): Boolean {
    require(!isEmpty()) { "Cannot check empty tree for balance" }
    val blackCount =
            generateSequence(root) { node -> node.left }
                    .count { !isRed(it) }
    return isBalanced(root, blackCount)
}

方法count()在其自己的段落中是为了便于阅读,并且takeWhile不是必需的。