Rekursive Funktion gibt keine in Python zurück [doppelte]

Diese Frage hat hier schon eine Antwort:

  • Ich erwarte 'True', aber bekomme 'Keine' 1 Antwort
  • Python-Rekursion mit Liste gibt keine Antwort zurück

Ich habe dieses Stück Code, aus irgendeinem Grund, wenn ich versuche, den Weg zurückzukehren, bekomme ich stattdessen:

def get_path(dictionary, rqfile, prefix=[]): for filename in dictionary.keys(): path = prefix+[filename] if not isinstance(dictionary[filename], dict): if rqfile in str(os.path.join(*path)): return str(os.path.join(*path)) else: get_path(directory[filename], rqfile, path) 

Gibt es eine Möglichkeit, dies zu lösen? Danke im Voraus.

2 Solutions collect form web for “Rekursive Funktion gibt keine in Python zurück [doppelte]”

Sie müssen das rekursive Ergebnis zurückgeben:

 else: return get_path(directory[filename], rqfile, path) 

Andernfalls endet die Funktion nach dem Ausführen dieser Anweisung, so dass None zurückgegeben wird.

Du möchtest wohl das else: und immer am Ende zurückkehren:

 for filename in dictionary.keys(): path = prefix+[filename] if not isinstance(dictionary[filename], dict): if rqfile in str(os.path.join(*path)): return str(os.path.join(*path)) return get_path(directory[filename], rqfile, path) 

Denn wenn rqfile in str(os.path.join(*path)) False dann rqfile in str(os.path.join(*path)) du deine Funktion auch ohne return . Wenn die Wiederholung in diesem Fall nicht die richtige Option ist, aber die Rücksendung von None ist nicht, müssen Sie auch diese Kante behandeln.

Während ich glaube, dass Martijn Pieters Antwort auf die primäre Frage in seiner Antwort (Sie müssen aus dem rekursiven Fall zurückkehren), ich glaube nicht, dass seine vorgeschlagenen Code wird richtig funktionieren.

Du versuchst, eine Tiefen-erste Suche nach dem rqfile Wert in dem verschachtelten dictionary Dict zu implementieren. Aber dein aktueller Code verarbeitet den rekursiven Fall nicht richtig. Es muss angemessen reagieren, wenn das Ergebnis in einem seiner rekursiven Anrufe gefunden wird oder wenn der rekursive Anruf das Ziel nicht gefunden hat.

Hier ist, was ich denke, Sie brauchen, mit einigen Dingen umbenannt oder umgeordnet für Klarheit:

 def get_path(directory, rqfile, prefix=[]): for filename, value in directory.items(): path_list = prefix + [filename] if not isinstance(value, dict): # base case path = os.path.join(*path_list) if rqfile in path: # Found the file. Do you want to do something return path # with the value here, or is it junk? else: # recursive case try: return get_path(value, rqfile, path_list) # this only returns if except ValueError: # the recursion doesn't raise pass raise ValueError("Requested file not found") # not found here or in children 

Beispiel:

 >>> directory = {"a": "a info", "b": {"c": "b/c info", "d": "b/d info"}, "e": {"f": "e/f info", "g": {"h": "e/g/h info"}}} >>> print(get_path(directory, "h")) e\g\h >>> print(get_path(directory, r'g\h')) e\g\h 

Wenn du keine Ausnahmen auslösen willst, wenn die Datei nicht gefunden wird, kannst du auch einen Sentinel-Wert wie None anstelle der letzten Zeile zurückgeben und auf den Sentinel-Wert im rekursiven Fall statt auf den try / except :

  result = get_path(value, rqfile, path) if result is not None: return result 
  • Berechnungsdeterminante einer Matrix (nxn) rekursiv
  • Python rekursive Funktion, die von 0 bis n?
  • Gibt es eine Möglichkeit, eine rekursive Funktion zu schreiben, die alle ganzen Zahlen in einer Liste durchsucht und sieht, ob irgendwelche zwei gleich einer negativen Summe sind?
  • Python rekursiv anhängen Liste Funktion
  • Python Recursive Funktion fehlende Ergebnisse
  • Rekursiv finden Sie die kth größte int in Liste der Liste der int in Python
  • Python Recursive Funktion für Collatz Conjecture
  • Python-Rekursions- und return-Anweisungen
  • Rekursiv finden Sie alle Münzkombinationen, die eine bestimmte Menge produzieren
  • Wie man sogar und ungerade Zahlen eines Arrays mit Rekursion summiert
  • Rekursionsfunktion funktioniert nicht richtig
  • Python ist die beste Programmiersprache der Welt.