EMZETT.
Giriş yap

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 n küçü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

  1. Temel durumu kontrol et: her seferinde ona ulaşılıyor mu?
  2. Özyineleme yerine bir döngü ve kendi yığınınla çalış (yinelemeli).
  3. Kuyruk özyinelemesi Python tarafından optimize edilmez; elle yeniden kur.
  4. Meşru derin özyineleme için sys.setrecursionlimit(10000) ayarla (dikkatli, çökme riski) veya yinelemeye geç.
  5. Not alma (functools.lru_cache) tekrarlanan çağrıları önler ama bir derinlik sorununu çözmez.
  6. Argümanları print ile yazdır ve nasıl değiştiklerini kontrol et.

Ayrıca bak: StackOverflowError, Özyineleme, Yığın ve öbek