使用Python,是否有可能在四叉树实现中消除多个递归尾调用(转换为迭代),它将点(X,Y)分配给子域(a.k.a.叶子节点)? 这是一个不那么伪代码:
def decompose(inX, inY, xmin, xmax, ymin, ymax, maxP):
#Paramters: Lists of X and Y coordinates, boundaries, max. #points per subdomain
if len(inX) <= maxP: #base case
--write out list of points and boundaries--
else:
xB = (xmin + xmax) / 2 #calculate new boundaries
yB = (ymin + ymax) / 2
for x, y in zip(inX, inY): #assign points to subdomains (a.k.a. children-nodes)
if x < xB:
if y < yB:
R1X.append(x), R1Y.append(y)
else:
R2X.append(x), R2Y.append(y)
else:
if y < yB:
R3X.append(x), R3Y.append(y)
else:
R4X.append(x), R4Y.append(y)
decompose(R1X, R1Y, xmin, xB, ymin, yB, maxP) #recursive tail calls (which I want to eliminate)
decompose(R2X, R2Y, xmin, xB, yB, ymax, maxP)
decompose(R3X, R3Y, xB, xmax, ymin, yB, maxP)
decompose(R4X, R4Y, xB, xmax, yB, ymax, maxP)
我知道消除尾调用的方法,但我见过的examples没有表现出递归四叉树分解(多个独立的递归尾调用)中固有的fork模式。我的动机是编写不会耗尽堆栈的代码,如果我在可能表现出大量聚类的数百万个点上使用它,从而导致非常深的递归。另外,我想要包含时间维度并实现空间缓冲区,以便可以将点分配给多个子域(我需要进行进一步处理)。由于大量的自定义,existing quadtree implementations可能不合适。如果你对另一位提出相同问题的新手感到厌倦,那就继续,祝你有个美好的一天,感谢阅读。否则你可以指向我帮助我解决问题的资源,或者你可以发布一个潜在的解决方案。如果你这样做,我会很高兴的。
答案 0 :(得分:0)
在你的例子中,我认为你有点误解尾递归。只有一个尾部,这就是行:
decompose(R4X, R4Y, xB, xmax, yB, ymax, maxP)
所以要打开尾递归代码,将if len(inX)...
更改为while len(inX)...
并将 last 分解为
inX, inY, ... = R4x, R4Y ...