2015-02-08 144 views
-4

所以我一直在Python中处理这个小的递归函数,并且我正在被踩踏。这里是我到目前为止,我想什么有:递归函数Python

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.收集器中的“i”是一个填充区域对象 2. GetBoundaries()返回CurveLoop对象的列表,它是可枚举的(List)曲线,所以我可以像列表一样迭代它们。这就是我在ToDSType方法中所做的。

+2

请问您还可以添加至少其他类的骨架(曲线,CurveLoop,边界,...?)所以它是一个有点抽象。 – Juergen 2015-02-08 17:30:30

+1

如果没有正确定义类/结构,就很难阅读和理解这个问题。我认为发布至少一个错误堆栈跟踪会有所帮助。而且,我能够发现一个问题;你的逻辑在这里是错误的:“如果不是getBoundaries:那么names.append(thing)else names.append(EntireListOfThingsThruRecursion)”。它应该是:'else:names = names + search_things(things.getBoundaries())' – SuperSaiyan 2015-02-08 17:32:47

+0

你在这里描述的看起来是这样的,不知道其他类:你得到错误的对象和thing.GetBoundaries()不起作用 - >你的for循环“在事物中”是不正确的。你可能会认为,“事物”(你能改变名称“东西”只是为了广泛!)有一个特殊的方法为曲线创建一个迭代器。 – Juergen 2015-02-08 17:35:02

回答

0

我不得不说这个问题对我来说太抽象了,但它看起来像一个标准的树遍历。我建议阅读Python Algorithms,遍历:算法的骨架关键(第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 

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