Seite 1 von 1

rekursion

Verfasst: Sonntag 28. Juli 2019, 21:14
von Tombery
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.

Re: rekursion

Verfasst: Sonntag 28. Juli 2019, 21:27
von __blackjack__
@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.

Re: rekursion

Verfasst: Montag 29. Juli 2019, 06:10
von ThomasL
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!

Re: rekursion

Verfasst: Montag 29. Juli 2019, 11:26
von Tombery
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^^

Re: rekursion

Verfasst: Montag 29. Juli 2019, 11:49
von sparrow
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.

Re: rekursion

Verfasst: Montag 29. Juli 2019, 12:11
von Sirius3
@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.