Jestem całkiem nowy w "funkcjach rekursywnych". Tak więc próbuję objaśnić, dlaczego używamy funkcji rekursywnych i jak działają funkcje rekursywne i myślę, że mam dość dobre zrozumienie.Jak działają funkcje rekursywne wewnątrz pętli for?
Dwa dni temu próbowałem rozwiązać najkrótszy problem z trasą. Mam poniższy wykres (jest w Pythonie):
graph = {'a': ['b', 'c'],
'b': ['c', 'd'],
'c': ['d'],
'd': ['c'],
'e': ['f'],
'f': ['c']}
Po prostu staram się znaleźć drogę, a nie najkrótszą path.So, oto kod:
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'))
Moja początkowa wierzchołek to "a", a końcowy wierzchołek to "d".
W czwartym wierszu właśnie wydrukowałem "ścieżkę", aby zobaczyć, gdzie idzie ścieżka.
W linii 17 wydrukowałem również "ścieżkę", ponownie tylko do przetestowania. A oto wynik:
['a']
['a', 'b']
['a', 'b', 'c']
['a', 'b', 'c', 'd']
['a', 'b', 'c']
['a', 'b']
['a']
['a', 'b', 'c', 'd']
Pierwsze cztery wiersze wyniku to wynik "print (path)" na linii 4 kodu. Ale wiersz 5, 6 i 7 jest wynikiem "print (path)" w linii 17. kodu.
Moje pytanie brzmi, dlaczego lista ścieżek maleje o jeden wierzchołek za każdym razem?
Próbowałem znaleźć rozwiązanie na 2 dni. Poszedłem na fora, przeczytałem dokumentację o rekursji i obejrzałem filmy. Ale bez powodzenia.
Byłbym wdzięczny, gdyby ktoś mógł odpowiedzieć.
BTW, trzeba być ostrożnym przy użyciu domyślnych argumentów zmienny jak 'path'. Zobacz ["Najlżejszy zdziwienie" i argument Mutable Default] (https://stackoverflow.com/q/1132941/4014959). –
W rzeczywistości powód, dla którego lista wierzchołków zmniejsza się o jeden dla każdej linii, wynika z faktu, że wykonujesz wywołanie rekursywne do 'find_path' * przed * funkcją' print'. Jeśli chcesz, aby listy były drukowane w odwrotnej kolejności, możesz * najpierw * 'print (path)' i * po tym * wykonać rekurencyjne wywołanie 'find_path'. –