recursion java tutorial with examples
Java'da Özyineleme Üzerine Bu Derinlemesine Eğitim Örnekler, Türler ve İlgili Kavramlarla Özyinelemenin ne olduğunu açıklar. Aynı zamanda Özyineleme Vs Yinelemesini de kapsar:
Java'daki önceki eğitimlerimizden, bir döngü ilan ettiğimiz ve ardından bir seferde bir öğe alarak bir veri yapısında yinelemeli bir şekilde geçtiğimiz yinelemeli yaklaşımı gördük.
Yine bir döngü değişkenini tuttuğumuz ve döngü değişkeni koşulu karşılayana kadar bir kod parçasını tekrarladığımız koşullu akışı da gördük. İşlev çağrıları söz konusu olduğunda, işlev çağrıları için de yinelemeli yaklaşımı keşfettik.
=> TÜM Java Öğreticilerini Buradan Kontrol Edin.
Bu eğitimde, programlamaya farklı bir yaklaşımı, yani Özyinelemeli yaklaşımı tartışacağız.
Ne öğreneceksin:
- Java'da Özyineleme Nedir?
- Java'da Özyineleme Vs Yineleme
- Sonuç
Java'da Özyineleme Nedir?
Özyineleme, bir işlevin veya yöntemin kendisini tekrar tekrar çağırdığı bir süreçtir. Doğrudan veya dolaylı olarak tekrar tekrar çağrılan bu işleve 'özyinelemeli işlev' denir.
Özyinelemeyi anlamak için çeşitli örnekler göreceğiz. Şimdi özyineleme sözdizimini görelim.
Özyineleme Sözdizimi
Özyinelemeyi uygulayan herhangi bir yöntemin iki temel bölümü vardır:
- Kendini, yani özyinelemeli olarak adlandırabilen yöntem çağrısı
- Özyinelemeyi durduracak bir ön koşul.
Herhangi bir özyinelemeli yöntem için bir ön koşulun gerekli olduğuna dikkat edin, çünkü özyinelemeyi bozmazsak sonsuza kadar çalışmaya devam edecek ve yığın taşmasıyla sonuçlanacaktır.
Özyinelemenin genel sözdizimi aşağıdaki gibidir:
methodName (T parameters…) { if (precondition == true) //precondition or base condition { return result; } return methodName (T parameters…); //recursive call }
Ön koşulun temel koşul olarak da adlandırıldığını unutmayın. Bir sonraki bölümde temel koşul hakkında daha fazla tartışacağız.
Java'da Özyinelemeyi Anlamak
Bu bölümde, özyineleme sürecini anlamaya ve nasıl gerçekleştiğini görmeye çalışacağız. Temel koşul, yığın taşması hakkında bilgi edinecek ve belirli bir sorunun özyineleme ve diğer ayrıntılarla nasıl çözülebileceğini göreceğiz.
Özyineleme Temel Koşulu
Özyinelemeli programı yazarken, önce temel durum için çözüm sağlamalıyız. Sonra daha büyük problemi daha küçük problemler açısından ifade ederiz.
Bir misal, bir sayının faktöriyelini hesaplamakla ilgili klasik bir problemi ele alabiliriz. Bir n sayısı verildiğinde, n ile gösterilen bir faktöriyel bulmalıyız!
Şimdi n faktöriyelini (n!) Özyineleme kullanarak hesaplamak için programı uygulayalım.
public class Main{ static int fact(int n) { if (n == 1) // base condition return 1; else return n*fact(n-1); } public static void main(String() args) { int result = fact(10); System.out.println('10! = ' + result); } }
Çıktı
Bu programda durumunun (n<=1) is the base condition and when this condition is reached, the function returns 1. The else part of the function is the recursive call. But every time the recursive method is called, n is decremented by 1.
Böylece sonuçta n değerinin 1 veya 1'den küçük olacağı sonucuna varabiliriz ve bu noktada yöntem 1 değerini döndürecektir. Bu temel koşula ulaşılacak ve fonksiyon duracaktır. Temel koşulu karşıladığı sürece n'nin değerinin herhangi bir şey olabileceğini unutmayın.
Özyinelemeyi Kullanarak Problem Çözme
Özyinelemeyi kullanmanın arkasındaki temel fikir, daha büyük problemi daha küçük problemler açısından ifade etmektir. Ayrıca, özyinelemeden çıkabilmemiz için bir veya daha fazla temel koşul eklememiz gerekir.
Bu, yukarıdaki faktöriyel örnekte zaten gösterildi. Bu programda n faktöriyelini (n!) Daha küçük değerler cinsinden ifade ettik ve temel koşul (n<=1) so that when n reaches 1, we can quit the recursive method.
Özyinelemede Yığın Taşma Hatası
Herhangi bir yöntem veya işlev çağrıldığında, işlevin durumunun yığında saklandığını ve işlev döndüğünde geri alındığının farkındayız. Yığın, özyinelemeli yöntem için de kullanılır.
Ancak özyineleme durumunda, temel koşulu tanımlamazsak veya temel koşula bir şekilde ulaşılmadığında veya yürütülmediğinde bir sorun ortaya çıkabilir. Bu durum meydana gelirse, yığın taşması ortaya çıkabilir.
Aşağıdaki faktöriyel notasyon örneğini ele alalım.
Burada yanlış bir temel koşul verdik, n == 100.
public class Main { static int fact(int n) { if (n == 100) // base condition resulting in stack overflow return 1; else return n*fact(n-1); } public static void main(String() args) { int result = fact(10); System.out.println('10! = ' + result); } }
Dolayısıyla, n> 100 olduğunda, yöntem 1 döndürür ancak özyineleme durmaz. Durdurmak için başka bir koşul olmadığından n'nin değeri sonsuza kadar azalmaya devam edecektir. Bu, yığın taşana kadar devam edecek.
Başka bir durum, n'nin değerinin<100. In this case, as well the method will never execute the base condition and result in a stack overflow.
Java'da Özyineleme Örnekleri
Bu bölümde, özyinelemeyi kullanarak aşağıdaki örnekleri uygulayacağız.
# 1) Özyineleme Kullanan Fibonacci Serileri
Fibonacci serisi,
1,1,2,3,5,8,13,21,34,55, ...
Yukarıdaki sıra, mevcut öğenin önceki iki öğenin toplamı olduğunu gösterir. Ayrıca Fibonacci serisindeki ilk eleman 1'dir.
Yani genel olarak n mevcut sayı ise, (n-1) ve (n-2) toplamı ile verilir. Mevcut eleman önceki elemanlarla ifade edildiğinden, bu problemi özyineleme kullanarak ifade edebiliriz.
Fibonacci serisini uygulama programı aşağıda verilmiştir:
public class Main { //method to calculate fibonacci series static int fibonacci(int n) { if (n <= 1) { return n; } return fibonacci(n-1) + fibonacci(n-2); } public static void main(String() args) { int number = 10; //print first 10 numbers of fibonacci series System.out.println ('Fibonacci Series: First 10 numbers:'); for (int i = 1; i <= number; i++) { System.out.print(fibonacci(i) + ' '); } } }
Çıktı
# 2) Bir Sayının Özyineleme Kullanan Bir Palindrom Olup Olmadığını Kontrol Edin
Bir palindrom, onu soldan sağa veya sağdan sola okuduğumuzda eşit olan bir dizidir.
121 sayısı verildiğinde, onu soldan sağa ve sağdan sola okuduğumuzda eşit olduğunu görürüz. Dolayısıyla 121 numara bir palindromdur.
Başka bir sayı olan 1242'yi alalım. Soldan sağa okuduğumuzda 1242 ve sağdan sola okunduğunda 2421 olarak okuyor. Yani bu bir palindrom değil.
Sayıların basamaklarını ters çevirerek ve verilen sayıyı tersine çevrilmiş gösterimi ile özyinelemeli olarak karşılaştırarak palindrom programını uygularız.
Aşağıdaki program, palindromu kontrol etmek için programı uygular.
import java.io.*; import java.util.*; public class Main { // check if num contains only one digit public static int oneDigit(int num) { if ((num >= 0) && (num <10)) return 1; else return 0; } //palindrome utility function public static int isPalindrome_util (int num, int revNum) throws Exception { // base condition; return if num=0 if (num == 0) { return revNum; } else { //call utility function recursively revNum = isPalindrome_util(num / 10, revNum); } // Check if first digit of num and revNum are equal if (num % 10 == revNum % 10) { // if yes, revNum will move with num return revNum / 10; } else { // exit throw new Exception(); } } //method to check if a given number is palindrome using palindrome utility function public static int isPalindrome(int num) throws Exception { if (num < 0) num = (-num); int revNum = (num); return isPalindrome_util(num, revNum); } public static void main(String args()) { int n = 1242; try { isPalindrome(n); System.out.println('Yes, the given number ' + n + ' is a palindrome.'); } catch (Exception e) { System.out.println('No, the given number ' + n + ' is not a palindrome.'); } n = 1221; try { isPalindrome(n); System.out.println('Yes, the given number ' + n + ' is a palindrome.'); } catch (Exception e) { System.out.println('No, the given number ' + n + ' is not a palindrome.'); } } }
Çıktı
# 3) Ters Dize Özyineleme Java
'Merhaba' dizesi verildiğinde, ortaya çıkan dizenin 'olleH' olması için onu tersine çevirmemiz gerekir.
Bu, özyineleme kullanılarak yapılır. Dizedeki son karakterden başlayarak, dizedeki tüm karakterler tükenene kadar her karakteri yinelemeli olarak yazdırırız.
Aşağıdaki program, belirli bir dizgeyi tersine çevirmek için özyinelemeyi kullanır.
class String_Reverse { //recursive method to reverse a given string void reverseString(String str) { //base condition; return if string is null or with 1 or less character if ((str==null)||(str.length() <= 1)) System.out.println(str); else { //recursively print each character in the string from the end System.out.print(str.charAt(str.length()-1)); reverseString(str.substring(0,str.length()-1)); } } } class Main{ public static void main(String() args) { String inputstr = 'SoftwareTestingHelp'; System.out.println('The given string: ' + inputstr); String_Reverse obj = new String_Reverse(); System.out.print('The reversed string: '); obj.reverseString(inputstr); } }
Çıktı
# 4) İkili Arama Java Özyinelemesi
İkili arama algoritması, arama için ünlü bir algoritmadır. Bu algoritmada, sıralı bir n eleman dizisi verildiğinde, bu dizide verilen anahtar elemanı ararız. Başlangıçta dizinin orta elemanını bularak diziyi ikiye böleriz.
Daha sonra anahtarın ortasına bağlı olarak aramamızı dizinin birinci veya ikinci yarısında sınırlandırıyoruz. Bu şekilde, aynı süreç, anahtar unsurların yeri bulunana kadar tekrar edilir.
Burada özyineleme kullanarak bu algoritmayı uygulayacağız.
import java.util.*; class Binary_Search { // recursive binary search int binarySearch(int numArray(), int left, int right, int key) { if (right >= left) { //calculate mid of the array int mid = left + (right - left) / 2; // if the key is at mid, return mid if (numArray(mid) == key) return mid; // if key key) return binarySearch(numArray, left, mid - 1, key); // Else recursively search in the right subarray return binarySearch(numArray, mid + 1, right, key); } // no elements in the array, return -1 return -1; } } class Main{ public static void main(String args()) { Binary_Search ob = new Binary_Search(); //declare and print the array int numArray() = { 4,6,12,16,22}; System.out.println('The given array : ' + Arrays.toString(numArray)); int len = numArray.length; //length of the array int key = 16; //key to be searched int result = ob.binarySearch(numArray, 0, len - 1, key); if (result == -1) System.out.println('Element ' + key + ' not present'); else System.out.println('Element ' + key + ' found at index ' + result); } }
Çıktı
# 5) Özyinelemeyi Kullanarak Dizide Minimum Değeri Bulun
Özyinelemeyi kullanarak dizideki minimum değeri de bulabiliriz.
Dizideki minimum değeri bulan Java programı aşağıda verilmiştir.
import java.util.*; class Main { static int getMin(int numArray(), int i, int n) { //return first element if only one element or minimum of the array elements return (n == 1) ? numArray(i) : Math.min(numArray(i), getMin(numArray,i + 1 , n - 1)); } public static void main(String() args) { int numArray() = { 7,32,64,2,10,23 }; System.out.println('Given Array : ' + Arrays.toString(numArray)); int n = numArray.length; System.out.print('Minimum element of array: ' + getMin(numArray, 0, n) + '
'); } }
Çıktı
Bunlar, özyineleme örneklerinden bazılarıdır. Bu örneklerin dışında, yazılımdaki diğer birçok sorun özyinelemeli teknikler kullanılarak uygulanabilir.
Özyineleme Türleri
Özyineleme, çağrının özyinelemeli yönteme ne zaman yapıldığına bağlı olarak iki türdendir.
Onlar:
# 1) Kuyruk Özyinelemesi
Özyinelemeli yönteme yapılan çağrı, özyinelemeli yöntem içinde yürütülen son ifade olduğunda, buna 'Kuyruk Özyineleme' denir.
Kuyruk özyinelemede, özyinelemeli çağrı ifadesi genellikle yöntemin return ifadesiyle birlikte yürütülür.
Kuyruk özyineleme için genel sözdizimi aşağıda verilmiştir:
methodName ( T parameters…){ { if (base_condition == true) { return result; } return methodName (T parameters …) //tail recursion }
# 2) Baş Özyineleme
Baş özyineleme, kuyruk özyineleme olmayan herhangi bir özyinelemeli yaklaşımdır. Yani genel özyineleme bile önde gelen özyinedir.
Head recursion sözdizimi aşağıdaki gibidir:
Windows 7 için en iyi kötü amaçlı yazılım temizleme
methodName (T parameters…){ if (some_condition == true) { return methodName (T parameters…); } return result; }
Java'da Özyineleme Vs Yineleme
Özyineleme | Yineleme |
---|---|
Zaman karmaşıklığı çok yüksek. | Zaman karmaşıklığı nispeten daha düşüktür. |
Özyineleme, bir yöntemin, bir temel koşul karşılanana kadar kendisini tekrar tekrar çağırdığı bir süreçtir. | Yineleme, bir kod parçasının sınırlı sayıda veya bir koşul karşılanana kadar tekrar tekrar çalıştırıldığı bir süreçtir. |
Fonksiyonlar için bir uygulamadır. | Döngüler için geçerlidir. |
Daha küçük kod boyutu için iyi çalışır. | Daha büyük kod boyutu için iyi çalışır. |
Her özyinelemeli çağrı yığına itildiğinde daha fazla bellek kullanır | Nispeten daha az bellek kullanılır. |
Hata ayıklaması ve bakımı zor | Hata ayıklama ve bakımı daha kolay |
Temel koşul belirtilmezse veya ulaşılmazsa yığın taşmasıyla sonuçlanır. | Sonsuz olarak çalışabilir, ancak nihayetinde herhangi bir bellek hatasıyla yürütmeyi durdurur |
Sıkça Sorulan Sorular
S # 1) Java'da Özyineleme nasıl çalışır?
Cevap: Özyinelemede, özyinelemeli işlev, bir temel koşul karşılanana kadar kendini tekrar tekrar çağırır. Çağrılan fonksiyonun hafızası, çağıran fonksiyon hafızasının tepesindeki yığına itilir. Her işlev çağrısı için, yerel değişkenlerin ayrı bir kopyası yapılır.
S # 2) Özyineleme neden kullanılır?
Cevap: Özyineleme, daha küçük parçalara ayrılabilen sorunları çözmek için kullanılır ve tüm sorun daha küçük bir sorun olarak ifade edilebilir.
Özyineleme, yinelemeli bir yaklaşım kullanılarak çözülemeyecek kadar karmaşık olan sorunlar için de kullanılır. Zaman karmaşıklığının sorun olmadığı sorunların yanı sıra, özyinelemeyi kullanın.
S # 3) Özyinelemenin faydaları nelerdir?
Cevap:
Özyinelemenin faydaları şunları içerir:
- Özyineleme, gereksiz işlev çağrısını azaltır.
- Özyineleme, yinelemeli yaklaşıma kıyasla sorunları daha kolay çözmemizi sağlar.
S # 4) Hangisi daha iyi - Özyineleme mi, Yineleme mi?
Cevap: Özyineleme, temel işleve ulaşılana kadar tekrarlanan çağrılar yapar. Böylece, her işlev çağrısı için bir bellek yığına itildiği için bir bellek ek yükü vardır.
Öte yandan yinelemenin fazla bellek yükü yoktur. Özyineleme yürütme, yinelemeli yaklaşımdan daha yavaştır. Yineleme, kodun boyutunu azaltırken yinelemeli yaklaşım kodu büyütür.
S # 5) Yinelemenin Yinelemeye Göre Avantajları Nelerdir?
Cevap:
- Özyineleme, kodu daha net ve kısaltır.
- Yineleme, Hanoi Kulesi, ağaç geçişleri vb. Gibi sorunlar için yinelemeli yaklaşımdan daha iyidir.
- Her işlev çağrısı yığına itilen belleğe sahip olduğundan, Özyineleme daha fazla bellek kullanır.
- Yineleme performansı, yinelemeli yaklaşımdan daha yavaştır.
Sonuç
Özyineleme, programlama dilinden bağımsız olarak yazılımda çok önemli bir kavramdır. Yineleme, çoğunlukla Hanoi kuleleri, ağaç geçişleri, bağlantılı listeler vb. Gibi veri yapısı sorunlarının çözümünde kullanılır. Daha fazla bellek gerektirmesine rağmen, özyineleme, kodu daha basit ve daha net hale getirir.
Bu eğitimde Özyineleme hakkında her şeyi keşfettik. Kavramın daha iyi anlaşılması için çok sayıda programlama örneği de uyguladık.
=> Kolay Java Eğitim Serisini Okuyun.
Önerilen Kaynaklar
- C ++ 'da Özyineleme
- Java Yineleyici: Java'da Yineleyicileri Örneklerle Kullanmayı Öğrenin
- Java'da ListIterator Arayüzü Örneklerle
- Yeni Başlayanlar İçin JAVA Eğitimi: 100+ Uygulamalı Java Video Eğitimi
- Program Örnekleriyle Döngü İçin Java Eğitimi
- Java While Loop - Programlama Örnekleriyle Öğretici
- Döngüde Java Yap - Örneklerle Öğretici
- Java'da Jagged Array - Örneklerle Eğitim