2015-02-08 133 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 

對不起,不完整的答案,沒有信譽添加評論。