gpt4 book ai didi

swift - 在 Swift 中实现简单树结构的递归生成器

转载 作者:搜寻专家 更新时间:2023-10-31 08:25:51 24 4
gpt4 key购买 nike

我在内存中有一个基于 XML 文档的简单树结构,我正在尝试编写一个递归生成器来支持 SequenceType,但我不知道如何实际执行此操作。

这是我的第一次尝试:

@objc public class XMLNode: NSObject, SequenceType {
public weak var parentNode: XMLNode?
public var nodeName: String
public var attributes: [String: String]
public var childNodes = [XMLNode]()

public func generate() -> AnyGenerator<XMLNode> {
var childGenerator = childNodes.generate()
var returnedSelf = false

return anyGenerator {
let child = childGenerator.next()

if child != nil {
// I need to somehow recurse on child here

return child
} else if !returnedSelf {
returnedSelf = true
return self
} else {
return nil
}
}
}
}

因为 childNodes 是一个数组,我调用它自己的内置 generate() 函数在子节点上创建一个生成器并迭代它,然后最后返回 self。问题是它不会在每个 child 身上递归,所以它只会深入一层。我不知道如何以这种方式组合两个生成器。

我很难思考如何做到这一点!制作递归生成器需要做什么?

最佳答案

我不知道生成器本身是否可以递归。 威尔男 proved me wrong !

这是一个前序遍历的可能实现,对仍然需要枚举的子节点使用堆栈:

extension XMLNode : SequenceType {
public func generate() -> AnyGenerator<XMLNode> {
var stack : [XMLNode] = [self]
return anyGenerator {
if let next = stack.first {
stack.removeAtIndex(0)
stack.insertContentsOf(next.childNodes, at: 0)
return next
}
return nil
}
}
}

对于层序遍历,替换

stack.insertContentsOf(next.childNodes, at: 0)

通过

stack.appendContentsOf(next.childNodes)

关于swift - 在 Swift 中实现简单树结构的递归生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35278610/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com