- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
Merhaba! Birçok matematiksel ve mantıksal problem, çözümü kendisinin daha küçük bir versiyonuna indirgendiğinde çok daha zarif bir şekilde ifade edilebilir. Özyineleme (Recursion), bir fonksiyonun kendi kendini çağırması anlamına gelir.
Özyinelemenin Temel Fikri:
Büyük bir problem çözülmek istenir.
Fonksiyon, problemin büyük kısmını çözmek yerine, kendisinin daha basit bir versiyonunu çözmek için kendini tekrar çağırır.
Bu çağrı zinciri, problem artık çözülemeyecek kadar küçülene kadar devam eder.
Özyineleme, döngülere (for, while) alternatif bir akış kontrol yöntemidir ve özellikle ağaçlar, grafikler ve hiyerarşik veri yapıları gibi karmaşık veri yapılarıyla çalışırken çok kullanışlıdır.
Bir özyinelemeli fonksiyonun doğru ve güvenli çalışması için iki zorunlu bileşeni vardır:
Bu, fonksiyonun kendini tekrar çağırmayı durdurduğu koşuldur.
Bu koşul olmadan, fonksiyon sonsuza kadar kendi kendini çağırır ve bellek taşması hatasına (RecursionError) neden olur.
Fonksiyonun, çözülmesi gereken problemi kendisinin daha basit bir versiyonuna indirgeyerek kendini tekrar çağırdığı kısımdır.
Faktöriyel ($n! = n \times (n-1)!$) hesabı, özyinelemenin klasik bir örneğidir.
Tanım: $5! = 5 \times 4 \times 3 \times 2 \times 1$.
Özyinelemeli Kural: $n! = n \times (n-1)!$
Taban Durumu: $1! = 1$ veya $0! = 1$
def faktoriyel(n):
# 1. Taban Durumu: n, 1'den küçük veya eşit olduğunda dur
if n <= 1:
return 1
# 2. Özyinelemeli Adım: Kendisinin (n-1)! versiyonunu çağır
else:
return n * faktoriyel(n - 1)
print(faktoriyel(5)) # Çıktı: 120 (5 * 4 * 3 * 2 * 1)Nasıl Çalışır (faktoriyel(3) için):
faktoriyel(3) çağrıldı. 3 * faktoriyel(2) döndürülür.
faktoriyel(2) çağrıldı. 2 * faktoriyel(1) döndürülür.
faktoriyel(1) çağrıldı. Taban durumuna ulaştı, 1 döndürülür.
Geriye dönüş başlar: 2 * 1 = 2 döndürülür.
Geriye dönüş devam eder: 3 * 2 = 6 döndürülür. Sonuç 6'dır.
Fibonacci serisi de özyineleme için harika bir örnektir ($F(n) = F(n-1) + F(n-2)$).
# Taban Durumu
if n <= 1:
return n
# Özyinelemeli Adım
else:
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(6))
# Çıktı: 8 (Seri: 0, 1, 1, 2, 3, 5, 8...)Özyineleme kodun zarif ve kısa olmasını sağlasa da, bazı dezavantajları vardır:
Bellek Tüketimi (Stack Overflow): Her özyinelemeli çağrı, bellekte yeni bir "yığın çerçevesi" (stack frame) oluşturur. Çok derin çağrılar, belleği hızla tüketerek RecursionError'a neden olabilir. Python'ın varsayılan özyineleme derinliği (limit) yaklaşık 1000'dir.
Performans: Çoğu durumda, özellikle basit sayma işlemlerinde, for veya while döngüsü kullanmak özyinelemeden daha hızlı ve daha verimlidir. (Fibonacci örneğinde tekrarlanan hesaplamalar nedeniyle özyineleme yavaş olabilir).
Okunabilirlik: Özellikle yeni başlayanlar için, özyinelemeli kodun akışını takip etmek bazen zor olabilir.
Özyineleme, her zaman döngülerden daha iyi değildir, ancak doğal olarak özyinelemeli olan problemler (örneğin ağaç ve grafik yapılarını gezmek, QuickSort veya MergeSort gibi algoritmalar) için en temiz ve en sezgisel çözümü sunar. Bir özyinelemeli fonksiyon yazarken, Taban Durumunu asla unutmadığınızdan emin olun!
Hemen kursumuza kaydolun ve bu güçlü araçları kullanarak profesyonel Python geliştiricisi olma yolunda ilk adımı atın. Kursumuzdaki uygulamalı modüller, sizi sadece bir yazılımcı adayı değil, hazır bir profesyonel haline getirecek. Python Eğitimini Udemy platformunda bulabilirsiniz.
Yorumlar
Yorum Gönder