Tôi khá mới trong 'hàm đệ quy'. Vì vậy, tôi đang cố gắng để quấn đầu của tôi xung quanh lý do tại sao chúng tôi sử dụng chức năng đệ quy và làm thế nào đệ quy chức năng làm việc và tôi nghĩ rằng tôi đã có một sự hiểu biết khá tốt về nó.Chức năng đệ quy hoạt động bên trong 'vòng lặp for' như thế nào
Hai ngày trước, tôi đã cố gắng giải quyết vấn đề đường đi ngắn nhất. Tôi đã một đồ thị sau (đó là trong python):
graph = {'a': ['b', 'c'],
'b': ['c', 'd'],
'c': ['d'],
'd': ['c'],
'e': ['f'],
'f': ['c']}
Tôi chỉ cố gắng để tìm một con đường, không phải là path.So ngắn nhất, đây là mã:
def find_path(graph,start,end,path=[]):
path = path + [start]
#Just a Test
print(path)
if start == end:
return path
if start not in graph:
return None
for node in graph[start]:
if node not in path:
new_path = find_path(graph,node,end,path)
if new_path:
#Just a test
print(path)
return new_path
print(find_path({'a':['b','c'],'b':['c','d'],'c':['d'],'d':['c'],'e':
['f'],'f':['c']},'a','d'))
tôi khởi đầu đỉnh là 'a' và đỉnh kết thúc là 'd'.
Trong dòng thứ tư, tôi chỉ in 'đường dẫn' để xem con đường đi đến đâu.
Trên dòng 17, tôi cũng in 'đường dẫn', một lần nữa chỉ để kiểm tra. Và đây là kết quả:
['a']
['a', 'b']
['a', 'b', 'c']
['a', 'b', 'c', 'd']
['a', 'b', 'c']
['a', 'b']
['a']
['a', 'b', 'c', 'd']
Bốn dòng đầu tiên của kết quả là kết quả của 'in (đường dẫn)' trên dòng 4 của mã. Tuy nhiên, dòng thứ 5, thứ 6 và thứ 7 là kết quả của 'in (đường dẫn)' trên dòng 17 của mã.
Câu hỏi của tôi là tại sao danh sách đường dẫn giảm một đỉnh mỗi lần?
Tôi đã cố gắng tìm giải pháp đó trong 2 ngày. Tôi đã đi đến diễn đàn, đọc tài liệu về đệ quy và xem video. Nhưng, không may mắn.
Tôi sẽ rất tuyệt nếu ai đó có thể trả lời.
BTW, bạn cần phải cẩn thận khi sử dụng đối số mặc định có thể thay đổi như 'đường dẫn'. Vui lòng xem ["Ít ngạc nhiên nhất" và Đối số mặc định có thể thay đổi] (https://stackoverflow.com/q/1132941/4014959). –
Thực ra lý do tại sao danh sách các đỉnh bị giảm một cho mỗi dòng là do thực tế là bạn thực hiện cuộc gọi đệ quy đến 'find_path' * trước * chức năng' print'. Nếu bạn muốn các danh sách được in theo thứ tự ngược lại thì bạn có thể * đầu tiên * 'print (path)' và * sau đó * thực hiện cuộc gọi đệ quy đến 'find_path'. –