递归函数Python

时间:2015-02-08 17:22:12

标签: python recursion

所以我一直在使用Python中的这个小递归函数,我正在st脚。这是我到目前为止所拥有的以及我希望拥有的内容:

def search_things(things):
    names = []
    for thing in things:
        if not thing.GetBoundaries():
            names.append(thing)
        else:
            names.append(search_things(thing.GetBoundaries()))
    return names

好的,在这种情况下,对此定义(事物)的输入将是FilledRegion对象的列表。每个对象都有它的边界,这正是我想要得到的。边界是CurveLoop可枚举对象,其中包含构成每个边界的曲线列表。

所以基本上如果我想了解曲线本身,我会选择一个填充区域并执行此操作:

boundaries = FilledRegion.GetBoundaries()

这将返回CurveLoop对象的列表。每个CurveLoop都包含一个曲线列表。

for loop in boundaries:
    for curve in loop:
        curves.append(curve)

这会让我得到我想要的曲线。有没有办法稍微修改原始功能?现在,因为GetBoundries()返回一个CurveLoop对象列表而不是曲线本身我得到一个错误,CurveLoop没有属性GetBoundaries。如何将曲线列表返回到每个填充区域的子列表中?

所以我走向了一个不同的方向。我无法将它全部包含在一个定义中,因此我创建了一些:

def process_list(_func, _list):
    return map( lambda x: process_list(_func, x) if type(x)==list else _func(x), _list )

def ToDSType(item):
    curves = []
    for i in item:
        curves.append(i.ToProtoType())
    return curves

curves = []
for i in collector:
    curves.append(process_list(ToDSType, i.GetBoundaries()))

有没有办法结合这些方法?我猜这是一个抽象的问题,因为你无法测试任何这些代码,但语法明智。 1."我"收集器中是一个填充区域对象 2. GetBoundaries()返回一个CurveLoop对象列表,它是可枚举(List)的曲线,所以我可以像列表一样迭代它们。这就是我在ToDSType方法中所做的事情。

1 个答案:

答案 0 :(得分:0)

我不得不说这个问题对我来说太抽象了,但它看起来像是一个标准的树遍历。我建议阅读Python Algorithms,Traversal:Algorithmics的Skeleton Key(第5章)。有很多很好的解释例子。

Listing 5-2. Finding Connected Components
-----------------------------------------
def components(G):                  # The connected components
    comp = []               
    seen = set()                    # Nodes we've already seen
    for u in G:                     # Try every starting point
        if u in seen: continue      # Seen? Ignore it
        C = walk(G, u)              # Traverse component
        seen.update(C)              # Add keys of C to seen
        comp.append(C)              # Collect the components
    return comp

对不完整的答案,没有声誉添加评论。