如何在Swift中构建递归函数来返回String



我有一个Node类,定义如下。value: TString

class Node<T> {
var value: T
weak var parent: Node?
var children = [Node<T>]()
init(_ value: T) {
self.value = value
}
func add(_ node: Node<T>) {
children.append(node)
node.parent = self
}
}

我想构建一个函数来返回当前Node的值和所有Parent值的String。理想情况下,函数将在类中定义。例如,

currentnode.listAllValues()
would return -> "/parent2value/parent1value/currentnodevalue"

到目前为止,以下函数使用一个简单的print(),我还考虑过使用inout参数。

func listAllValues(node: Node<String>) {
print(node.value)
if node.parent?.value != nil {
listAllValues(node: node.parent!)
}
}

您可以通过一个实例方法来实现这一点,该方法首先在父节点上调用自己(如果有(:

func listAllValues() -> String {
if let p = parent {
return "(p.listAllValues())/(value)"
} else {
return "/(value)"
}
}

或者作为一个模糊的一行:

func listAllValues() -> String {
return "(parent?.listAllValues() ?? "")/(value)"
}

示例:

let p2 = Node("parent2value")
let p1 = Node("parent1value") ; p2.add(p1)
let n = Node("currentNodeValue") ; p1.add(n)
print(n.listAllValues())
// --> /parent2value/parent1value/currentNodeValue

开始:

func desc(_ s:String? = nil) -> String {
var me = String(describing:self.value)
if let prev = s {
me += "/" + prev
}
return self.parent?.desc(me) ?? me
}

示例:

let n = Node("hey")
n.add(Node("ho"))
n.children.first?.add(Node("nonny nonny no"))
let start = n.children.first!.children.first!
print(start.desc())

最新更新