Recursion 迭代定义深度的递归分割

Recursion 迭代定义深度的递归分割,recursion,split,tree,iteration,depth,Recursion,Split,Tree,Iteration,Depth,我有两个顶点(a)和(b),我想在它们的中点递归地分割它们 模式如下所示: a_b = self.abfn( a, b) ab_b = self.abfn( a_b, b) a_ab = self.abfn( a, a_b) abb_b = self.abfn(ab_b, b) ab_abb = self.abfn( a_b, ab_b) a_aab = self.abfn( a, a_

我有两个顶点(a)和(b),我想在它们的中点递归地分割它们

模式如下所示:

       a_b = self.abfn(   a,    b)

      ab_b = self.abfn( a_b,    b)
      a_ab = self.abfn(   a,  a_b)
    
     abb_b = self.abfn(ab_b,    b)
    ab_abb = self.abfn( a_b, ab_b)
     a_aab = self.abfn(   a, a_ab)
    aab_ab = self.abfn(a_ab,  a_b)

对于这个特定的深度,我可以这样写:

       a_b = self.abfn(   a,    b)

      ab_b = self.abfn( a_b,    b)
      a_ab = self.abfn(   a,  a_b)
    
     abb_b = self.abfn(ab_b,    b)
    ab_abb = self.abfn( a_b, ab_b)
     a_aab = self.abfn(   a, a_ab)
    aab_ab = self.abfn(a_ab,  a_b)
然而,我想写它,这样我可以定义一个深度,并重复拆分到该深度。 需要注意的是,我不想使用递归函数

如何以这种方式进行迭代


我正在使用python,但语言并不重要。

您可以使用以下代码:

def midpoint(a, b):
    return ((a[0] + b[0]) / 2, (a[1] + b[1]) / 2)

def abfn(a, b, depth):
    vertices = [a, b]
    for _ in range(depth):
        nextlevel = vertices[:1]
        for a, b in zip(vertices, vertices[1:]):  # all consecutive pairs
            mid = midpoint(a, b)
            nextlevel.extend((mid, b))
        vertices = nextlevel
    return vertices
示例调用:

a = (0, 100)
b = (0, 200)
vertices = abfn(a, b, 2)

print(vertices)
输出:

[(0, 100), (0.0, 125.0), (0.0, 150.0), (0.0, 175.0), (0, 200)]

你在图形中使用的数据结构是什么?@trincot我正在使用一个具有基本笛卡尔坐标的api——顶点就是(x,y)。基本上只是元组的python列表。这回答了你的问题吗?x从左到右排序,y从下到上排序,所以节点由数字标识(是x和y数字吗?)是的,只是x,y元组,这很有效,太棒了!修复了图像和upvote/accept。谢谢。我听说递归调用比较慢,而且调试起来非常困难,但在如何正确地循环它的问题上遇到了难题。在这种情况下,递归实现不会太慢(如果有的话),但由于递归只不过是所谓的“尾递归”,因此迭代方法在这里并不太牵强。当您有一个递归算法在递归的每个阶段进行两个(或更多)递归调用时,情况就完全不同了。在这种情况下,一个迭代等价物将需要使用一个显式堆栈来实际模拟递归方法。。。这可以用简单的向量数学而不是递归来完成吗?
middpoint
函数就是我所说的向量数学,所以你可能会问,它是否可以不用递归来完成?是的,它可以。您可以得到2^个相同大小的深度段,因此您也可以迭代地执行此操作。