【问题标题】:Iterating a recursive split of defined depth迭代定义深度的递归拆分
【发布时间】:2021-01-06 15:08:00
【问题描述】:

我有两个顶点 (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,但语言并不重要。

【问题讨论】:

  • 您的图表使用什么数据结构?
  • @trincot 我正在使用一个具有基本笛卡尔坐标的api——顶点只是(x,y)。基本上只是元组的python列表。这能回答你的问题吗?
  • x 从左到右排序,y 从下到上排序
  • 所以节点是用数字标识的(x和y是数字吗?)
  • 是的,只是 x,y 元组

标签: recursion split tree iteration depth


【解决方案1】:

您可以使用以下代码:

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)]

【讨论】:

  • 我听说递归调用速度较慢,而且调试起来非常困难,但对如何正确循环感到困惑。
  • 在这种情况下,递归实现不会慢得多(如果有的话),但由于递归只不过是所谓的“尾递归”,因此迭代方法并不遥远- 在这里取来的。当您有一个递归算法在递归的每个阶段进行两次(或更多)递归调用时,情况就不同了。在这种情况下,迭代等效项将需要使用显式堆栈来实际模仿递归方法。
  • 现在看这个,我想知道,因为沿线的每个点都只是向量的一个分割......这可以通过简单的向量数学而不是递归来完成吗?
  • 嗯,midpoint 函数就是我所说的向量数学,所以也许你问它是否可以在没有递归的情况下完成?是的,它可以。您将获得 2^depth 个相同大小的段,因此您也可以迭代地执行此操作。
  • 假设我想将中点偏移一个特定的值,这个算法会按预期工作吗?我尝试使用此处描述的部分公式tutorialspoint.dev/algorithm/geometric-algorithms/…,但得到了意想不到的结果。不确定是数学问题还是 api 问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 2021-10-09
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
相关资源
最近更新 更多