Forum: PC-Programmierung Python-Rekursion


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Jr M. (maxie21)


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?

von Εrnst B. (ernst)


Lesenswert?

Und wo bist du bei deiner Hausaufgabe steckengeblieben?

Kannst du genug Python, um zu erklären, was das Wort "stack" in dieser 
Zeile bedeutet:
1
def reverse(stack):

von Joachim S. (oyo)


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.

: Bearbeitet durch User
von Xanthippos (xanthippos)


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.

von Rick (rick)


Lesenswert?

Um Rekursion zu verstehen, muß man jemanden kennen, der Rekursion 
verstanden hat...

von Xanthippos (xanthippos)


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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.