Hiç, bir sorunun sürekli olarak daha küçük parçalara bölündüğü, görünüşte bitmeyen bir döngüye yakalandınız mı?
Eğer öyleyse, büyüleyici özyineleme dünyasına gelmiş olabilirsiniz. Anlaması zor gibi görünse de endişelenmeyin! Bu gönderide, özyineleme türleri hakkında bilgi edinmek için ilginç bir yolculuğa çıkacağız.
Bu yüzden, sayısız özyinelemeli yaklaşımı keşfederken kemerlerinizi bağlayın. Özyinelemenin büyüleyici dünyasına girmeye hazırlanın ve karmaşık sorunları çözmedeki olağanüstü yeteneğini gözlemleyin.
Özyinelemeler Tam Olarak Nedir?
Basit bir ifadeyle özyineleme, yürütme sırasında kendisini çağıran bir işlevi içeren güçlü bir programlama tekniğidir. Bir aynaya bakıp bir görüntünün içinde bir görüntü görmek gibi, bu da kendine referanslı bir döngüyle sonuçlanır.
Özyinelemeyi kullanarak büyük sorunları daha küçük, daha yönetilebilir alt sorunlara bölerek çözebiliriz.
Bu, tam bir resim oluşturmak için bir parçanın diğer parçalara bağlandığı bir yapbozu bir araya getirmeye benzer. Özyineleme, aynı talimat setini çeşitli girdilerle tekrarlayarak sorunları zarif ve verimli bir şekilde çözmemizi sağlar.
1-Doğrudan Özyineleme
Doğrudan özyineleme, bir işlevin kendisini doğrudan çağırdığı en temel özyineleme türüdür. Bir temel durum elde edilene kadar problemli bir problemin daha küçük alt problemlere bölünmesini gerektirir, bu da sonlandırmaya yol açar.
Özyinelemeli işlev, kendisini çeşitli girdilerle çağırarak, aynı komut dizisinin tekrarlanmasını sağlar. Her çağrı bir öncekinin üzerine inşa edilir ve özyinelemenin sona ermesine neden olan temel duruma kademeli olarak yaklaşır.
Bu örneği kontrol edelim.
def countdown(n):
if n <= 0:
return
print(n)
countdown(n - 1)
countdown(5)
Çıktı:
5
4
3
2
1
2-Dolaylı Özyineleme
Dolaylı özyineleme, özyinelemeli yola ilgi çekici bir bükülme ekler. Açıkça kendisini çağıran bir işlevi içeren doğrudan özyinelemenin aksine, dolaylı özyineleme bir işlev çağrıları zinciri içerir.
Bir işlev diğerini çağırır, bu da daha sonra orijinal işlevi veya en sonunda orijinaline geri dönen herhangi bir başka işlevi çağırabilir. Bu birbirine bağlı işlev çağrıları ağı, birkaç işlevin bir sorunu çözmek için işbirliği yaptığı büyüleyici bir dans oluşturur.
Örnek:
def function_A(n):
if n > 0:
print("A:", n)
function_B(n - 1)
def function_B(n):
if n > 0:
print("B:", n)
function_A(n - 1)
function_A(3)
Çıktı:
A: 3
B: 2
A: 1
3-Doğrusal Özyineleme
Hedefinize ulaşana kadar, düz bir rotada, adım adım bir yolculuk düşünün. Bu sıralı teknik, bir fonksiyonun her fonksiyon yinelemesinde tek bir yinelemeli çağrı gerçekleştirdiği doğrusal yineleme ile somutlaştırılır.
Her yinelemeli çağrıda, yinelemeli süreç sorun boyutunu düşürerek bir temel duruma yaklaşır. Nihai cevaba ulaşılana kadar alt problemleri birer birer çözerek net ve doğrusal bir şekilde ilerler.
Örnek:
def factorial(n):
if n == 0:
return 1
return n * factorial(n - 1)
result = factorial(5)
print(result)
Çıktı:
120
4-Ağaç Özyineleme
Bir işlev birkaç özyinelemeli çağrıya ayrıldığında, ağaç özyineleme dünyasına gireriz. Ağaç özyinelemedeki bir işlev, tıpkı bir ağacın dallarının yaptığı gibi, her biri ayrı bir alt problemi çözen birçok özyinelemeli çağrı üretir.
Bu dallara ayrılan yapı, çeşitli yolların eşzamanlı olarak araştırılmasına izin vererek, karmaşık sorunları etkili bir şekilde daha küçük, birbiriyle ilişkili bileşenlere ayırır.
Örnek:
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
result = fibonacci(6)
print(result)
Çıktı:
8
5-İç İçe Özyineleme
Yuvalanmış özyineleme, özyinelemeli evrene heyecan verici derecede karmaşıklık katar. Bu özyineleme biçiminde, bir işlev özyinelemeli bir çağrıyı başka bir özyinelemeli çağrının içinde argüman olarak birleştirir.
İç özyinelemeli çağrı, dış özyinelemeli aramaya bağlı bir değer üzerinde hareket eder. Karmaşıklık, iç içe geçmiş her çağrıyla birlikte büyür ve iç içe geçmiş yinelemeli çağrıların ilginç bir modeliyle sonuçlanır.
Örnek:
def nested_recursion(n):
if n > 100:
return n - 10
return nested_recursion(nested_recursion(n + 11))
result = nested_recursion(95)
print(result)
Sonuç:
91
6-Kuyruk Özyineleme
Kuyruk özyinelemesi, özyinelemeli algoritmalar için performanslarını iyileştirebilen bir optimizasyon tekniğidir. Özyinelemeli çağrı, kuyruk özyinelemeli bir fonksiyonun son eylemi olarak görünür, yapım.
Özyinelemeli çağrıyı izleyen olağanüstü işlemler olmadığından, derleyici veya yorumlayıcı özyinelemeyi basit bir atlamayla değiştirerek basitleştirebilir.
Kuyruk çağrısı optimizasyonu olarak bilinen bu optimizasyon yaklaşımı, her yinelemeli çağrının bir yığın çerçevesi tutma gereksinimini azaltır, bu da gelişmiş hız ve daha düşük bellek kullanımı ile sonuçlanır.
Örnek:
def tail_factorial(n, result=1):
if n == 0:
return result
return tail_factorial(n - 1, result * n)
result = tail_factorial(5)
print(result)
Dışarı dışarı:
120
7-Kuyruksuz Özyineleme
Kuyruk özyinelemenin aksine, kuyruk olmayan özyineleme, bir işlev içinde özyinelemeli çağrıdan sonra gerçekleştirilen ekstra etkinlikleri içerir. Daha fazla eylem gerçekleştirilmeden önce, her özyinelemeli çağrı tamamlanmalı ve geri dönmelidir.
Sonuç olarak, temel duruma ulaşılana ve özyineleme sona erene kadar, bekleyen işlemler yığını korunur. Kuyruksuz özyineleme sıklıkla daha fazla bellek kullanır ve kuyruk özyinelemeden daha az verimlidir, ancak yine de çeşitli sorunların üstesinden gelmek için yararlı bir araçtır.
Örnek:
def non_tail_sum(n):
if n == 0:
return 0
return n + non_tail_sum(n - 1)
result = non_tail_sum(5)
print(result)
Çıktı:
15
Sarmak
Özyineleme, programlamada ilgi çekici bir kavramdır. Karmaşık sorunları yinelemeli, kendine referanslı bir şekilde ele almamızı sağlar.
Sorunları daha küçük, daha yönetilebilir parçalara bölerek, düşünmek ve sorunları çözmek için farklı bir yöntem sunar. Yineleme ile çalışırken, bazı noktalara dikkat etmek önemlidir.
Özyinelemenin sona ermesine izin veren uygun temel durumları belirlemelisiniz. Mevcut değillerse, işlev kendisini sonsuza kadar çağırmaya devam edebilir.
İkincisi, eldeki senaryoya dayalı olarak, uygun özyineleme türünün seçilmesi daha verimli ve zarif çözümlere yol açabilir. Eldeki problem için neyin en iyi olduğunu bulmaya çalışın. Geniş yineleme derinlikleriyle çalışırken yığın taşması gibi potansiyel tehlikelerin farkında olun.
Yorum bırak