Sie haben keinen Speicherplatz mehr im Stapel, da Sie die Funktion sich 2983 mal nennen lassen, was bedeutet, dass Sie die Anzahl der Rückgabeadressen und Argumente auf dem Stapel speichern, was nicht sinnvoll ist.
Wenn Ihre Anforderung Rekursion zu verwenden ist, können Sie die Rekursionstiefe O (log n) um, indem Sie diese reduzieren:
def multiplyer(fir, sec):
if sec==1:
return fir
elif sec==0:
return 0
else:
return multiplyer(fir, sec//2) + multiplyer(fir, (sec+1)//2)
print(multiplyer(5, 2983))
Oder effizienter, auch die Anzahl der rekursiven Aufrufe zu Reduzierung O (log n) Reihenfolge:
def multiplyer(fir, sec):
if sec==0:
return 0
elif sec%2 == 0:
return 2 * multiplyer(fir, sec//2)
else:
return fir + 2 * multiplyer(fir, sec//2)
print(multiplyer(5, 2983))
Aber hier ist Ihre Funktion einfach "fir * sec" ... –
Nein, Sie, äh, erreichte buchstäblich die maximale Rekursion. Versuchen Sie es mit einem niedrigeren 'sec' Wert und es wird funktionieren. – spicypumpkin
hast du recht. Aber es gibt eine theoretische Frage: Kann ich einen Generator zur Optimierung dieser Funktion verwenden? – pinkychyaz