8
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Tôi có một cơ sở dữ liệu mô hình hóa mối quan hệ thư mục với các mức n
của việc làm tổ. Đối với bất kỳ thư mục nhất định, tôi muốn tạo một danh sách tất cả các thư mục trẻ em.
Giả sử tôi có một chức năng gọi là getChildFolders[]
, cách hiệu quả nhất để gọi loại vòng lặp đệ quy này là gì?
Mã sau đây hoạt động cho 4 cấp độ làm tổ, nhưng tôi muốn linh hoạt hơn trong việc chỉ định độ sâu của đệ quy, hoặc trong việc dừng lại một cách thông minh khi không còn trẻ em làm theo.
folder_ids = []
folder_ids.append[folder.id]
for entry in child_folders:
folder_ids.append[entry.id]
child_folders_1 = getChildFolders[entry.id]
for entry_1 in child_folders_1:
folder_ids.append[entry_1.id]
child_folders_2 = getChildFolders[entry_1.id]
for entry_2 in child_folders_2:
folder_ids.append[entry_2.id]
child_folders_3 = getChildFolders[entry_2.id]
for entry_3 in child_folders_3:
folder_ids.append[entry_3.id]
Đã hỏi ngày 9 tháng 11 năm 2010 lúc 21:31Nov 9, 2010 at 21:31
1
Chức năng đệ quy là một cách tốt đẹp để làm điều này:
def collect_folders[start, depth=-1]
""" negative depths means unlimited recursion """
folder_ids = []
# recursive function that collects all the ids in `acc`
def recurse[current, depth]:
folder_ids.append[current.id]
if depth != 0:
for folder in getChildFolders[current.id]:
# recursive call for each subfolder
recurse[folder, depth-1]
recurse[start, depth] # starts the recursion
return folder_ids
Đã trả lời ngày 9 tháng 11 năm 2010 lúc 21:39Nov 9, 2010 at 21:39
Jochen Ritzeljochen RitzelJochen Ritzel
102K29 Huy hiệu vàng196 Huy hiệu bạc191 Huy hiệu Đồng29 gold badges196 silver badges191 bronze badges
6
Tôi thường tránh đệ quy như bệnh dịch hạch trong Python vì nó chậm và vì toàn bộ điều xảy ra tình trạng tràn.
def collect_folders[start]:
stack = [start.id]
folder_ids = []
while stack:
cur_id = stack.pop[]
folder_ids.append[cur_id]
stack.extend[folder.id for folder in getChildFolders[cur_id]]
return folder_ids
Điều này giả định rằng getChildFolders
trả về một danh sách trống khi không có con. Nếu nó làm một cái gì đó khác, như trả lại giá trị sentinel hoặc tăng một ngoại lệ, thì các sửa đổi sẽ phải được thực hiện.
Đã trả lời ngày 9 tháng 11 năm 2010 lúc 21:43Nov 9, 2010 at 21:43
Aaronasterlingaaronasterlingaaronasterling
66.9K20 Huy hiệu vàng124 Huy hiệu bạc125 Huy hiệu đồng20 gold badges124 silver badges125 bronze badges
1
def my_recursive_function[x, y, depth=0, MAX_DEPTH=20]:
if depth > MAX_DEPTH:
return exhausted[]
elif something[x]:
my_recursive_function[frob[x], frob[y], depth + 1]
elif query[y]:
my_recursive_function[mangle[x], munge[y], depth + 1]
else:
process[x, y]
# A normal call looks like this.
my_recursive_function[a, b]
# If you're in a hurry,
my_recursive_function[a, b, MAX_DEPTH=5]
# Or have a lot of time,
my_recursive_function[a, b, MAX_DEPTH=1e9]
Đã trả lời ngày 9 tháng 11 năm 2010 lúc 21:34Nov 9, 2010 at 21:34
2
Đây là mã gần nhất với mã của bạn và rất không có âm thanh:
def recurse[folder_ids, count]:
folder_ids.append[folder.id]
for entry in child_folders:
folder_ids.append[entry.id]
child_folders_1 = getChildFolders[entry.id]
if count > 0:
recurse[folder_ids, count-1]
folder_ids = []
recurse[folder_ids, 4]
Bạn có lẽ nên tìm kiếm os.walk
và thực hiện một cách tiếp cận tương tự để đi bộ cây.
Đã trả lời ngày 9 tháng 11 năm 2010 lúc 21:40Nov 9, 2010 at 21:40
LloekilloekiLloeki
6.4332 Huy hiệu vàng31 Huy hiệu bạc32 Huy hiệu Đồng2 gold badges31 silver badges32 bronze badges
4
Tôi cần một cái gì đó tương tự một lần để kiểm tra một cây phân cấp. Bạn có thể thử:
def get_children_folders[self,mother_folder]:
'''
For a given mother folder, returns all children, grand children
[and so on] folders of this mother folder.
'''
folders_list=[]
folders_list.append[mother_folder]
for folder in folders_list:
if folder not in folders_list: folders_list.append[folder]
new_children = getChildFolders[folder.id]
for child in new_children:
if child not in folders_list: folders_list.append[child]
return folders_list
Đã trả lời ngày 22 tháng 9 năm 2014 lúc 18:33Sep 22, 2014 at 18:33
Pedrovgppedrovgppedrovgp
6878 Huy hiệu bạc23 Huy hiệu Đồng8 silver badges23 bronze badges