Recursion Erlang中的四叉树操作-编辑四叉树记录会使父项无效吗?

Recursion Erlang中的四叉树操作-编辑四叉树记录会使父项无效吗?,recursion,erlang,quadtree,Recursion,Erlang,Quadtree,所以这个问题是理论性的,我主要想知道这个场景对于我们的理论四叉树会是怎样的 树本身是一个包含对象、边界和子对象的记录。到目前为止,这些子项是其他四叉树记录。所以,这将是一个很大的结构,取决于拆分的数量 假设我想删除第3级子树中的一个对象。这能正确地保存父对象及其父对象吗?如果我写下这样的话: Quad#quad{objects = ListWithoutSaidObject}. 没有以函数调用将上述行的结果保存在适当的子变量中的方式实际执行递归?像这样: delete_object(Quad,

所以这个问题是理论性的,我主要想知道这个场景对于我们的理论四叉树会是怎样的

树本身是一个包含对象、边界和子对象的记录。到目前为止,这些子项是其他四叉树记录。所以,这将是一个很大的结构,取决于拆分的数量

假设我想删除第3级子树中的一个对象。这能正确地保存父对象及其父对象吗?如果我写下这样的话:

Quad#quad{objects = ListWithoutSaidObject}.
没有以函数调用将上述行的结果保存在适当的子变量中的方式实际执行递归?像这样:

delete_object(Quad, ObjectToDelete) ->
    <nice code to find proper child if not present in current>
    Quad#quad{child = delete_object(Quad#quad.child, ObjectToDelete)}.
delete_对象(Quad,ObjectToDelete)->
Quad#Quad{child=delete_对象(Quad#Quad.child,ObjectToDelete)}。
其中delete_对象返回相同的四叉树,如果它在该树中,则不返回该对象,否则它将继续挖掘,直到找到包含它应该移除的对象的树。找到后,它将删除它,并返回新的子树

这不是尾递归,据我所知,这是我需要做的,以避免弄乱树。我错了吗?我认为,如果我将每棵树作为一个单独的进程来实现,并将它们的PID存储在每棵树中,同时保存父树,我可以更有效地完成这项工作


因为我还没有任何代码,所以我不能给出示例。我在问,所以在我实现之前,我知道我应该用哪种方式来实现它。

Erlang数据结构是不可变的,所以如果不获得原始树的新副本,就不能对子树进行变异。副本将尽可能多地与原始树共享—它之所以能够共享,是因为它具有上述不变性—因此这听起来可能比实际情况更糟

除了不必担心混乱的数据结构之外,它还提供了同时使用新旧树的可能性


因此,在您的示例中,您确实需要递归,如果出现问题,您可以构建一个更高阶的函数来执行递归,并将您想做的任何事情作为参数传递给孩子们。

除了Peer Stritzinger的答案外:


四叉树通常不太适合删除。

我就是这么想的。现在我用进程的方式来做,每个树都是一个进程,如果它有子进程,记录中会列出它的子进程的pid。制作高阶函数听起来是个好主意。谢谢!:)