RecursionError (Python)
Kısaca: Bir işlev durmadan kendini çok sık çağırır; Python yaklaşık 1000 seviyede keser.
Biraz daha ayrıntılı: Mesaj: RecursionError: maximum recursion depth exceeded. Her işlev çağrısı çağrı yığınında yer kaplar. Python, çökmeyi önlemek için derinliği sınırlar (varsayılan yaklaşık 1000). Java’daki StackOverflowError’ın Python karşılığıdır.
Ayrıntılı
Olası nedenler
- Eksik veya yanlış temel durum: özyinelemenin sonu yok.
- Adım temel duruma doğru götürmüyor (örneğin
nküçülmüyor). - İki işlev arasında karşılıklı özyineleme.
- Çok derin ama meşru özyineleme (uzun listeler, ağaçlar, derin grafikler).
- Bir metot
__getattr__/propertyüzerinden istemeden kendini çağırıyor.
Örnek
def factorial(n):
return n * factorial(n - 1) # temel durum eksik!
def factorial(n):
if n <= 1: # temel durum
return 1
return n * factorial(n - 1)Çözümler
- Temel durumu kontrol et: her seferinde ona ulaşılıyor mu?
- Özyineleme yerine bir döngü ve kendi yığınınla çalış (yinelemeli).
- Kuyruk özyinelemesi Python tarafından optimize edilmez; elle yeniden kur.
- Meşru derin özyineleme için
sys.setrecursionlimit(10000)ayarla (dikkatli, çökme riski) veya yinelemeye geç. - Not alma (
functools.lru_cache) tekrarlanan çağrıları önler ama bir derinlik sorununu çözmez. - Argümanları
printile yazdır ve nasıl değiştiklerini kontrol et.
Ayrıca bak: StackOverflowError, Özyineleme, Yığın ve öbek