我有一个递归函数,它收集kd树的叶节点。此函数必须将 KdNode 作为参数。KdNode 具有以下类定义:
case class KdNode(value: (Double, Double), left: Option[KdNode], right: Option[KdNode], axis: Int, BB_A:BoundingBox, BB_B:BoundingBox)
将其作为参数的函数定义为:
def collectLeafNodes(t:KdNode): List[BoundingBox] = {
if(t == None) return
if (t.left == None && t.right == None) {
Some(listBoundingBox.::(t.BB_A,t.BB_B))
return
}
collectLeafNodes(t.left)
collectLeafNodes(t.right)}
在这里,我在最后 2 行遇到错误,说:"类型不匹配,预期:KdNode,实际:选项 [KdNode]。
我通过在变量"树"中构建 kd-tree 并将其作为参数来调用此函数:
val listofBoundingBoxes=collectLeafNodes(tree)
在这种情况下,可能的解决方法是什么?此外,我认为应该有一种方法可以将根节点而不是树传递给 collectLeafNodes 函数,这是可能的,因为树是在单独的函数中构建的。
谢谢。
您在评论中问如何在没有return
的情况下完成.这是一种方法。
def collectLeafNodes(t :KdNode) :List[BoundingBox] =
List(t.BB_A, t.BB_B) :::
t.left.fold(List.empty[BoundingBox])(collectLeafNodes) :::
t.right.fold(List.empty[BoundingBox])(collectLeafNodes)
结果,没有return
,是 3 个列表的串联:
- 由于
t
是KdNode
而不是Option[KdNode]
,我们知道BB
值是真实的。那是第一List
. - 如果
t.left
None
则第 2 个List
为空,否则第 2List
是递归调用返回collectLeafNodes(t.left)
的任何内容。(参数是自动提供的,因此无需指定。 - 第 3
List
与t.right
相同
仅针对叶节点进行了更正
def collectLeafNodes(t :KdNode) :List[BoundingBox] = {
if (t.left.isEmpty && t.right.isEmpty) List(t.BB_A, t.BB_B)
else t.left .fold(List.empty[BoundingBox])(collectLeafNodes) :::
t.right.fold(List.empty[BoundingBox])(collectLeafNodes)
}
您可以在选项对象上进行映射:
val res: List[BoundingBox] = t.left.map(collectLeafNodes).getOrElse(List())
因为 t.right 是 Option 的类型,而不是 Kdnode 的类型。
您可以解开包装选项来解决此问题,例如
collectLeafNodes(t.right.get)}
collectLeafNodes(t.right.orElse(None)}
希望这有帮助