从递归闭包中匹配条件 - Swift

时间:2018-03-29 22:57:14

标签: ios swift recursion closures

我希望得到第二双眼睛来查看这个在二叉树中搜索特定值的递归调用。

public func findMatchingCondition(_ process: (T) -> (Bool)) {
    switch self {
    case .empty: break
    case let .node(left, value, right):
        let condition = process(value)

        // If the height is 1 then reurn we found our matching or last condition
        if height < 2 {
            return
        }

        if condition {
            right.findMatchingCondition(process)
        } else {
            left.findMatchingCondition(process)
        }
    }
}

上述函数遍历二叉树,如果条件为真,则处理右侧,否则处理左侧。

var someEnum: SomeEnum? = nil
tree.findMatchingCondition {
    someEnum = $0
    return $0.value(inputValueToGetBool)
}

所以我的二叉树由枚举和枚举组成,它有一个名为value的函数,如果输入符合条件,则返回一个bool。

所以我想做的是横向树并返回特定的枚举,如果它的高度为1。

问题:除了设置一个可选的someEnum?然后将其传递到闭包中之外,还有更好的做法吗?

如果我正确解释,请告诉我!我可以重新编辑以更好地解释。

修改

抓高:

enum BinaryTree<T: Comparable> {

    case empty
    indirect case node(BinaryTree<T>, T, BinaryTree<T>)

    /* Distance of this node to its lowest leaf. Performance: O(n). */
    public var height: Int {
        switch self {
        case .empty: return 0
        case let .node(left, _, right): return 1 + max(left.height, right.height)
        }
    }

}

可能的解决方案:

也许使用inout参数?

1 个答案:

答案 0 :(得分:1)

我不认为从你传递的闭包内更新变量是个好主意。如果你想要更实用的东西,你可以使用类似

的东西
func traverse(until: (BinaryTree<T>) -> Bool, decision: (BinaryTree<T>) -> Bool) -> T? {
    switch tree {

    case .empty:
        return nil

    case let .node(left, value, right):

        if until(self) {
            return value
        } else {
            let nextNode = decision(self) ? left : right
            return nextNode.traverse(until: until, decision: decision)
        }
    }
}

然后你可以用

获得你的价值
let value = tree.traverse(
    until: { $0.height == 1 }, 
    decision: { $0.value == inputValueToGetBool }
)