Countdown bricht ab(Testzwecke)

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
hume
User
Beiträge: 9
Registriert: Mittwoch 24. August 2022, 17:07

Hallo und guten Tag zusammen,

ich habe einen Countdown auf Recursion zu Testzwecken erstellt und dieser läuft nicht bei Windows, also bricht bei 931ab Input Wert 3000.

Code: Alles auswählen

import sys
Eingabe = int(input("Bitte geben Sie eine Zahl ein "))
sys.setrecursionlimit(5000)

def countdown(x):
    if x==0:
        return x
    else:
        print(x)
        return countdown(x-1)


print(countdown(Eingabe))
Das Recursionslimit von 5000 wird also nicht erreicht, warum bricht er dann ab?
Bin bei Sololearn registriert und da läuft es einwandfrei herunter.
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Unter Linux geht's problemlos. Ich vermute mal das hier die Grenze des vom System vorgesehenen Stacks erreicht wird. Das kann man ggf. mit den hier https://docs.microsoft.com/en-us/window ... stack-size angegebenen Mitteln aendern.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@hume: Mit welcher Meldung bricht das denn ab? Am besten in einer Konsole gestartet, damit nicht irgendeine IDE eventuell die ausgaben verfälscht oder verschluckt.

Und das ist ein Grund warum man keine Rekursion als Ersatz für simple Schleifen verwenden sollte. Es gibt Programmiersprachen die haben „tail call optimization“ oder Mechanismen um so einen „tail call“ explizit zu machen, da kann man Rekursion auch für so etwas verwenden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,
__blackjack__ hat geschrieben: Mittwoch 24. August 2022, 17:40 @hume: Mit welcher Meldung bricht das denn ab? Am besten in einer Konsole gestartet
Auf Windows 10 die Konsole (cmd.exe) gestartet und bei einer Eingabe von 3000 hört die Ausgabe des Programms bei 874 auf ohne Fehlermeldung.
Das selbe nur unter PyCharm endet bei 538 mit der Meldung:

Code: Alles auswählen

Process finished with exit code -1073741571 (0xC00000FD)
Wenn man danach im Netz sucht, dann bestätigt sich die Antwort von @__deets__.
Zum Beispiel hier: https://stackoverflow.com/questions/625 ... -in-python

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
August1328
User
Beiträge: 65
Registriert: Samstag 27. Februar 2021, 12:18

Hab das kurz bei mir mal laufen lassen. Auf nem Win10 PC, i7 Prozessor, 16 Kerne, 16 GB RAM, Python 3.8 (ggf relevant, mein Ergebnis sieht leicht anders aus).

Wenn ich 3000 eingebe, zählt es bis 11 runter und hört einfach auf. Es gibt keine Fehlermeldung, auch nicht in VS Code.

Bei mir zählt es also etwas weiter, warum auch immer. Habe gerade versucht mich in sys errors und warnings einzulesen, aber das ist für heute Abend zu viel.

Also ein vom Prozessor und/oder Speicher abhängiges Problem?

Gruß
Andy
Benutzeravatar
Dennis89
User
Beiträge: 1156
Registriert: Freitag 11. Dezember 2020, 15:13

Dann ergänze ich meine Angaben auch nocht:
-Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz 2.59 GHz
-8,00 GB (7,84 GB verwendbar)

Code: Alles auswählen

python -V
Python 3.10.5
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich hatte unter Linux früher mal mit `sys.setrecursionlimit()` herumgespielt und auch dort Speicherzugriffsverletzungen wegen überlaufendem Stack hinbekommen. Das war noch unter einem 32-Bit-System — wahrscheinlich mit deutlich kleinerem Stack als das auf aktueller Hardware/Systemen üblich ist. Das Limit hoch zu setzen ist also generell keine so gute Idee.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
August1328
User
Beiträge: 65
Registriert: Samstag 27. Februar 2021, 12:18

Ich habe in der Mittagspause den von Dennis89 gefundenen Link studiert, weil mich das Thema interessiert.

Am Ende gibt es einen weiteren Link zu einem Artikel "Process finished with exit code -1073741571": https://stackoverflow.com/questions/206 ... 1073741571

Die Frage bzw. der Artikel beschreibt eigentlich genau das Problem und die 2. Antwort liefert eine Lösung per `sys.setrecursionlimit()`, wie von __blackjack__ geschrieben, und Threadig:

Code: Alles auswählen

if __name__ == '__main__':
    sys.setrecursionlimit(100000)
    threading.stack_size(200000000)
    thread = threading.Thread(target=your_code)
    thread.start()
 
Getestet habe ichs´nicht, sitze nun über meinem eigenen Python Projekt & Problemchen :lol:
hume
User
Beiträge: 9
Registriert: Mittwoch 24. August 2022, 17:07

__blackjack__ hat geschrieben: Mittwoch 24. August 2022, 17:40 @hume: Mit welcher Meldung bricht das denn ab? Am besten in einer Konsole gestartet, damit nicht irgendeine IDE eventuell die ausgaben verfälscht oder verschluckt.

Und das ist ein Grund warum man keine Rekursion als Ersatz für simple Schleifen verwenden sollte. Es gibt Programmiersprachen die haben „tail call optimization“ oder Mechanismen um so einen „tail call“ explizit zu machen, da kann man Rekursion auch für so etwas verwenden.
Hallo, also es bricht mit keiner Fehlermeldung ab, hört einfach auf zu zählen.

Mit freundlichen Grüßen

hume
hume
User
Beiträge: 9
Registriert: Mittwoch 24. August 2022, 17:07

Ok, also ich werde mir das ganze mal ansehen und dann mich nochmal melden.

Mit freundlichen Grüßen

hume
Antworten