Hướng dẫn for loop in recursive function python - vòng lặp for trong python hàm đệ quy

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

Bạn có thể sử dụng một vòng lặp cho chức năng đệ quy không?

Hàm đệ quy này có thể tương tự như các vòng. Đó là tất cả các chương trình được viết bằng các vòng lặp [có thể là vòng lặp 'trong khi' hoặc vòng lặp 'làm trong khi' hoặc vòng 'cho' '] có thể được viết thành công bằng cách sử dụng khái niệm chức năng đệ quy này.all those programs that are written using loops [may be the 'while' loop, or the 'do while' loop or the 'for' loop] can be successfully written using this concept of Recursive function.

Là cho vòng lặp lặp hoặc đệ quy?

Nói một cách đơn giản, một hàm lặp là một chức năng lặp lại để lặp lại một phần của mã và hàm đệ quy là một hàm tự gọi lại để lặp lại mã.Sử dụng một vòng đơn giản để hiển thị các số từ một đến mười là một quá trình lặp lại.Using a simple for loop to display the numbers from one to ten is an iterative process.

Chức năng đệ quy có tốt hơn vòng lặp trong Python không?

Một trong những khác biệt lớn giữa đệ quy và vòng lặp là cách mà một hàm đệ quy chấm dứt.Trong ví dụ trên, một vòng lặp cho kết thúc ở cuối chuỗi nó đang lặp lại.Tuy nhiên, một hàm đệ quy có thể tiếp tục vô thời hạn vì nó không nhất thiết có một chuỗi dữ liệu.. In the above example, a for loop ends at the end of the sequence it is looping over. However, a recursive function could continue indefinitely since it doesn't necessarily have a sequence of data.

Chúng ta có thể sử dụng trong khi các vòng lặp để thực hiện đệ quy trong Python không?

Người ta cho rằng đệ quy chỉ là một cách khác để hoàn thành điều tương tự như một vòng lặp.Trong một số trường hợp, điều này là hoàn toàn chính xác.Mặc dù vậy, có những cách sử dụng khác cho đệ quy rất hợp lệ, trong đó trong khi các vòng lặp hoặc cho các vòng lặp có thể không tối ưu.Đệ quy có thể được kiểm soát, giống như các vòng lặp.recursion is just another way to accomplish the same thing as a while loop. In some cases, this is absolutely correct. Though, there are other uses for Recursion that are very valid, where while loops or for loops may not be optimal. Recursion can be controlled, just like loops.

Bài Viết Liên Quan

Chủ Đề