Python-Rekursion

OP #7401865

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?

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.

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.

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

Eine eigene Frage? Dieser Thread ist über 3 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.