Rekursive Funktion iterativ implementieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Marco98
User
Beiträge: 3
Registriert: Donnerstag 21. April 2022, 22:53

Hey, ich habe hier eine rekursive Funktion aus einem Programm für Suchbäume und müsste diese iterativ implementieren, bzw. umändern:

def elem(v, t):
....if is_empty(t):
........return False
....elif v < value(t):
........return elem(v, left(t))
....elif v > value(t):
........return elem(v, right(t))
....else:
........return True

Wäre sehr dankbar, wenn mir jmd. dabei helfen könnte!
(Punkte sollen hier die Einrückungen darstellen)
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

Zuerst wird nicht mit Punkten eingerückt, sondern hier im Forum gibt es code-Tags, das ist der </>-Knopf im Vollständigen Editor.

Variablen sollten aussagekräftig sein, Funktionen nach Tätigkeiten benannt werden. Ich rate mal, dass `t` ein `tree` ist, `v` ein `value`.
Ich weiß nicht, warum hier der Zugriff auf Attribute als Funktionen implementiert ist.
Am schwierigsten war es, herauszufinden, was die Funktion eigentlich macht. Es ist wie bei diesen mathematischen Rätseln, wo Symbole durch Zahlen ersetzt werden sollen, damit die Gleichung stimmt. Programmieren ist aber an sich schon herausfordernd genug, da braucht es nicht noch zusätzliche Rätselspiele.
Der decodierte Code sieht also so aus:

Code: Alles auswählen

def is_value_in_tree(value, tree):
    if is_tree_empty(tree):
        return False
    elif value < tree.value:
        return is_value_in_tree(value, tree.left)
    elif value > tree.value:
        return is_value_in_tree(value, tree.right)
    else:
        return True
Rekursion bedeutet ja, dass die Funktion nochmal aufgerufen wird, also wieder von vorne losläuft. Wenn Du also die Rekursion "simulieren" willst, brauchst Du eine Schleife, die auch wieder an den Anfang springt, Du mußt aber davor dafür sorgen, dass die Parameter richtig gesetzt werden.
Marco98
User
Beiträge: 3
Registriert: Donnerstag 21. April 2022, 22:53

Sorry für die ungenaue Schreibweise meinerseits.
Genau t ist ein tree und v ein value!

Aber wie sieht diese Funktion dann iterativ aus???
wäre super, wenn mir das jemand kurz aufzeigen könnte, bitte.

Vielen Dank!
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Marco98: Wo ist denn Dein konkretes Problem bei der (Haus)Aufgabe? *Du* sollst das ja schreiben und nicht Dir schreiben lassen.

Iterativ heisst hier mit einer Schleife statt rekursiven Aufrufen. Und da die Funktion endrekursiv ist, ist das eigentlich auch recht trivial, weil man sich nicht mal den Aufrufstack selbst basteln muss, weil man dieses ansonsten implizite ”Gedächtnis” bei rekursiven Aufrufen nicht braucht.

Du könntest auch einfach die bisherige Implementierung gar nicht beachten, sondern den Funktionskörper einfach löschen und einfach neu programmieren. Halt ganz normal prozedural. Mal Dir einen Suchbaum auf Papier auf, und überlege welche Schritte Du manuell machen musst um die Aufgabe der Funktion zu lösen und setz das dann in Quelltext um.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten