rekursion

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
Tombery
User
Beiträge: 29
Registriert: Mittwoch 10. Juli 2019, 19:56

Bin auf das nächste Problem gestoße :(

Ich habe eine Funktion in meiner Function Datei. Diese wird von Main aufgerufen. Sie wählt basierend auf Hand, Ablage und von mult_karten eine oder mehrere Karten aus der Hand aus und liefert sie zurück.

Code: Alles auswählen

def selectCard( Hand, Ablage, mult_karten ):
	tut etwas
return mCard

In dieser Funktion gibt es nun eine Verzweigung in der sich die Funktion noch einmal aufrufen muss.
Dabei sollten sich die Argumente leicht verändern. Dies sieht ca. so aus.

Code: Alles auswählen

if 0 in Hand:
	selectCard(Hand.remove(0), Ab, mult_karten-1)

Das Problem ist jetzt natürlich, dass die hier nochmals aufgerufene Funktion natürlich den Hand Wert nicht an sich selbst geben kann, da sie dort nicht definiert ist.

Die Funktion wird von allen Spielern in Main aufgerufen und der Wert der Hand entspricht immer dem der sie aufgerufen hat. Wenn sie sich nun selbst aufruft ist das nicht definiert. Wie kann man dieses Problem umgehen?

Leute tut mir leid, dass ich euch so auf Trap halte aber momentan bin ich 24/7 am Code schreiben und da tauchen natürlich schnell recht viele Fragen auf.
Benutzeravatar
__blackjack__
User
Beiträge: 14045
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tombery: Du kannst da schon den Wert von `Hand` übergeben, nur tust Du das nicht. Du übergibst an der Stelle den Rückgabewert von der `remove()`-Methode. Also `None`. Dein Code ist äquivalent zu:

Code: Alles auswählen

    if 0 in hand:
        hand.remove(0)
        select_card(None, ablage, mult_karten - 1)
Und da fehlt ziemlich sicher auch noch etwas was sich um den Rückgabewert dieses rekursiven kümmert und etwas sinnvolles damit macht.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
ThomasL
User
Beiträge: 1378
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Und wenn du innerhalb der Funktion die Liste hand manipulierst, änderst du auch die ursprüngliche Liste, da call-by-reference. Du übergibst keine Kopie der Liste an die Funktion!
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Tombery
User
Beiträge: 29
Registriert: Mittwoch 10. Juli 2019, 19:56

Danke euch allen.
_blackjack_ hatte natürlich recht, remove gibt none zurück und das ist Blödsinn.
Habs verbessert und nun läuft es.

ThomasL ich wünschte ich hätte das gelesen und verstanden bevor ich mit dem Spiel angefangen habe.
Sehr viele meiner Funktionen machen etwas wobei ich eigentlich nur deren return Wert haben will.

Nun ist es zu spät und ich passe die ganze Zeit auf was die Funktion sonst noch so macht^^
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Tombery hat geschrieben: Montag 29. Juli 2019, 11:26Nun ist es zu spät und ich passe die ganze Zeit auf was die Funktion sonst noch so macht^^
Wie kommst du darauf, dass es zu spät ist?
Es ist ganz normal Code wegzuschmeißen und mit besserem Wissen neu zu schreiben. Das ist weitaus effektiver als schlechten Code zu warten.
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tombery: bisher steckst Du viel mehr Zeit in das Suchen von Bugs, als dass Du tatsächlich weiter kommst. Es ist deutlich effizienter, alles sauber neu zu schreiben, als in bestehenden schlechten Code noch mehr schlechten Code einpflegen zu müssen.
Wenn Du schon mal dabei bist, wäre es auch ein guter Zeitpunkt für jede Funktion ausreichend Tests zu schreiben.
Antworten