所以我一直在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方法中所做的。
請問您還可以添加至少其他類的骨架(曲線,CurveLoop,邊界,...?)所以它是一個有點抽象。 – Juergen 2015-02-08 17:30:30
如果沒有正確定義類/結構,就很難閱讀和理解這個問題。我認爲發佈至少一個錯誤堆棧跟蹤會有所幫助。而且,我能夠發現一個問題;你的邏輯在這裏是錯誤的:「如果不是getBoundaries:那麼names.append(thing)else names.append(EntireListOfThingsThruRecursion)」。它應該是:'else:names = names + search_things(things.getBoundaries())' – SuperSaiyan 2015-02-08 17:32:47
你在這裏描述的看起來是這樣的,不知道其他類:你得到錯誤的對象和thing.GetBoundaries()不起作用 - >你的for循環「在事物中」是不正確的。你可能會認爲,「事物」(你能改變名稱「東西」只是爲了廣泛!)有一個特殊的方法爲曲線創建一個迭代器。 – Juergen 2015-02-08 17:35:02