Python-Rekursion

OP #7401865
Lesenswert?

Untersuchen Sie zunächst den Code:

1
# Below is a recursive function that inserts an element
2
# at the bottom of a stack.
3
def insertAtBottom(stack, item):
4
    if isEmpty(stack):
5
        push(stack, item)
6
    else:
7
        temp = pop(stack)
8
        insertAtBottom(stack, item)
9
        push(stack, temp)
10
# Below is the function that reverses the given stack
11
# using insertAtBottom()
12

13
def reverse(stack):
14
    if not isEmpty(stack):
15
        temp = pop(stack)
16
        reverse(stack)
17
        insertAtBottom(stack, temp)

Da die aufgerufene Funktion keinen neuen Wert an die aufrufende Funktion zurückgibt, scheint es, dass die Funktion reverse Stack als globale Variable verwendet. Ist das nicht eine schlechte Methode, um Rekursion zu implementieren? Ist es nicht besser, die Verwendung globaler Variablen im Stack zu vermeiden? Ich bin mir nicht sicher, ob ich verstehe, wie man Rekursion in Python verwendet. Ich habe den Python-Code zum Umkehren eines Stacks nur mit Rekursion von dieser Seite https://www.scaler.com/topics/python/recursion-in-python/ kopiert. Wie würden wir diesen Code außerdem so ändern, dass jede Instanz der aufgerufenen Funktion ihre eigene Stack-Kopie hat?

#7401883
Lesenswert?

Jr M. schrieb:

Da die aufgerufene Funktion keinen neuen Wert an die aufrufende Funktion zurückgibt, scheint es, dass die Funktion reverse Stack als globale Variable verwendet. Ist das nicht eine schlechte Methode, um Rekursion zu implementieren? Ist es nicht besser, die Verwendung globaler Variablen im Stack zu vermeiden?

stack ist hier keine globale Variable. Was Du vielleicht eigentlich meinst, ist, dass die beiden Funktionen stack nicht "out-of-place", sondern "in-place" verändern. Sprich: Wenn Du bspw. der Funktion reverse() einen stack übergibst, dann hast Du nach Aufruf der Funktion reverse() nicht zwei stacks (einmal in der ursprünglichen, einmal in umgekehrter Reihenfolge) - sondern die stack-Instanz, die Du an die Funktion übergeben hast, hat nach dem Aufruf exakt die umgekehrte Reihenfolge wie vorher.

Rekursiv ist der Algorithmus aber trotzdem, das hat damit nichts zu tun. Wenn Du möchtest, dass das Ganze stattdessen out-of-place geschehen soll (also Du nicht stack selbst verändern, sondern eine veränderte Kopie haben willst), dann ist das einfachste: Den beiden Funktionen nicht stack selbst übergeben, sondern eine Kopie von stack.

#7402437
Lesenswert?

Vielleicht entsteht die Verwirrung, weil man Rekursion normalerweise im Zusammenhang mit Funktionaler Programmierung findet.

Dort ist der der zentrale Grundsatz: niemals irgend welche Daten verändern, immer die geänderten Daten als Funktionswert zurückliefern.

Die Python Anhänger sehen das nicht so dogmatisch.

#7413008
Lesenswert?

Nein, du musst nur jemanden kennen, der jemanden kennt, den er fragen kann.

Erinnerst du dich noch an Gödel Escher Bach?

Der Dschinn hatte es auch nicht Verstanden. Sagte "Einen Augenblick". In 1/2 Augenblick fragte er seinen übergeordneten Dschinn. Der wiederum fragte in 1/4 Augenblick seinen übergeordneten Dschinn. Der fragte in 1/8 Augenblick seinen Übergeordneten. 1/16 Augenblick, 1/32, 1/64... und so weiter bis in alle Unendlichkeit.

Innerhalb von einem Augenblick hatte der ursprüngliche Dschinn die Antwort. Obwohl es von den unendlich vielen Dschinns kein einziger verstanden hatte.

Beitrag #7447336 wurde von einem Moderator gelöscht.
Beitrag #7447356 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren