Özyineleme (recursion), bir fonksiyonun kendini çağırmasıdır. Recursive fonksiyon yazma kavramı, pek çok programcı için başlangıçta kafa karıştırıcı görünür; ancak doğru yapıyı bir kez kavradınızda oldukça güçlü bir araç haline gelir. **Temel Yapı: İki Zorunlu Parça** Her recursive fonksiyonun iki bölümü olmak zorundadır: 1. **Taban durum (base case):** Fonksiyonun kendini çağırmayı durduracağı koşul. Bu olmadan sonsuz döngüye girersiniz. 2. **Özyinelemeli durum (recursive case):** Fonksiyonun kendini daha küçük bir girdiyle çağırdığı bölüm. **Faktöriyel Örneği** En klasik recursive fonksiyon yazma örneği faktöriyel hesabıdır: ```python def faktoriyel(n): if n == 0: # taban durum return 1 return n * faktoriyel(n - 1) # recursive case ``` `faktoriyel(4)` çağrısı şu şekilde açılır: - faktoriyel(4) → 4 × faktoriyel(3) - faktoriyel(3) → 3 × faktoriyel(2) - faktoriyel(2) → 2 × faktoriyel(1) - faktoriyel(1) → 1 × faktoriyel(0) - faktoriyel(0) → 1 (taban durum) Geriye doğru katlanır: 1 × 1 × 2 × 3 × 4 = 24 **Fibonacci Örneği** ```python def fibonacci(n): if n <= 1: # taban durum return n return fibonacci(n-1) + fibonacci(n-2) ``` Bu örnek doğru çalışır ancak büyük sayılarda çok yavaşlar çünkü aynı değerleri tekrar tekrar hesaplar. Performans kritikse memoization ekleyin. **Yaygın Hatalar** - **Taban durumu koymamak:** Program çalışır ama "RecursionError: maximum recursion depth exceeded" hatasıyla durur. - **Girdiyi küçültmemek:** `faktoriyel(n)` içinde `faktoriyel(n)` çağrısı yine sonsuz döngüye girer. - **Taban durumunu yanlış yazmak:** `if n == 0` yerine `if n < 0` gibi erişilemeyen bir koşul koymak. **Ne Zaman Recursive Fonksiyon Kullanmalısınız?** Recursive fonksiyon yazma, problemin kendisi doğal olarak küçük alt parçalara bölünüyorsa uygundur: - Ağaç yapılarında gezinme - Dizin içeriği listeleme (iç içe klasörler) - Hızlı sıralama (quicksort), birleştirme sıralaması (merge sort) - Matematiksel seriler **Döngüyle Karşılaştırma** Her recursive fonksiyon bir döngüyle yazılabilir; ancak bazı problemler özyinelemeli yapıyla çok daha okunabilir olur. Ağaç gezinme veya bölme-fethet algoritmalarında özyineleme, döngüye kıyasla kodu belirgin biçimde kısaltır. Recursive fonksiyon yazma pratiği için küçük problemlerden başlayın: dizinin toplamı, karakter sayısı, palindrom kontrolü. Taban durumunu her zaman önce yazın, sonra özyinelemeli adımı ekleyin.