Ich bin ziemlich neu in 'rekursive Funktionen'. Ich versuche also, den Grund dafür zu nennen, warum wir rekursive Funktionen verwenden und wie rekursive Funktionen funktionieren, und ich denke, dass ich ein ziemlich gutes Verständnis davon habe.Wie rekursive Funktionen arbeiten innerhalb einer 'for-Schleife'
Vor zwei Tagen habe ich versucht, das Problem des kürzesten Weges zu lösen. Ich habe eine folgende Grafik (es ist in Python):
graph = {'a': ['b', 'c'],
'b': ['c', 'd'],
'c': ['d'],
'd': ['c'],
'e': ['f'],
'f': ['c']}
Ich bin nur einen Weg zu finden versuchen, nicht den kürzesten path.So, hier ist der Code:
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'))
Mein Ausgang Vertex ist 'a' und der Endknoten ist 'd'.
In der vierten Zeile habe ich nur den 'Pfad' gedruckt, um zu sehen, wo der Pfad hinführt.
In Zeile 17 habe ich auch den 'Pfad' gedruckt, wiederum nur zum Testen. Und hier ist das Ergebnis:
['a']
['a', 'b']
['a', 'b', 'c']
['a', 'b', 'c', 'd']
['a', 'b', 'c']
['a', 'b']
['a']
['a', 'b', 'c', 'd']
Die ersten vier Zeilen des Ergebnisses ist das Ergebnis des ‚print (Pfad)‘ in Zeile 4 des Codes. Aber Zeile 5, 6 und 7 ist das Ergebnis von 'Druck (Pfad)' in Zeile 17 des Codes.
Meine Frage ist warum die Liste des Pfades jedes Mal um einen Eckpunkt abnimmt?
Ich habe versucht, seine Lösung für 2 Tage zu finden. Ich bin in Foren gegangen, habe die Dokumentation über Rekursion gelesen und Videos angeschaut. Aber, kein Glück.
Ich wäre dankbar, wenn jemand antworten kann.
BTW, müssen Sie vorsichtig sein, wenn wie 'path' wandelbar Standardargumente verwenden. Bitte beachten Sie ["Least Astonishment" und das Mutable Default Argument] (https://stackoverflow.com/q/1132941/4014959). –
Der Grund, warum die Liste der Vertices für jede Zeile um eins abnimmt, liegt an der Tatsache, dass Sie den rekursiven Aufruf von 'find_path' * vor * der' print'-Funktion ausführen. Wenn Sie möchten, dass die Listen in umgekehrter Reihenfolge gedruckt werden, können Sie * zuerst * '(Pfad) drucken und * danach den rekursiven Aufruf von' Finde_Pfad' durchführen. –