Java'da özyineleme
n adlı bir int alan down metodu yazın. n 0 veya daha küçükse çıplak return; ile durun. Değilse n yazdırın, sonra aynı metot içinden down(n - 1) çağırın. main'den down(3); çağırın. Ekran üç satır göstermelidir: 3, sonra 2, sonra 1. Metot daha küçük sayıyla kendini çağırır ta ki durma zinciri bitirene kadar. Durmalı bu öz çağrı, bu sayfanın öğrettiği şeydir.
Kendini çağıran bir metot
Kapsam sayfasında mark bir kez çalışıp bitiyordu. Burada down çalışır, sonra ilk çağrı tamamen bitmeden yeni argümanlı başka bir down başlatır. Her çağrının kendi n'si vardır. Zincir ancak bir çağrı durmaya çarpınca biter.
Ladder.java adlı küçük bir program dosyası oluşturun. İlk satırdaki public class dosya adıyla uyuşmalıdır: public class Ladder. Bu dosyada eski bir Gate veya Sign sınıf adı bırakmayın; derleyici sınıf adı ile dosya adının uyuşmasını bekler.
main dışında, hâlâ sınıf süslü parantezlerinin içinde, static void down(int n) yazın. Bu sayfada void kalsın: her adım yazdırır ve tipli bir return ile bir şeyin dönmesi gerekmez. Durma değersiz return; kullanır — yalnızca bu çağrıyı bitirir. Derlemeden önce dosyayı kaydedin. İlk tam program sonraki kutudadır.
down ile Ladder.java
Bu, önce derlediğiniz sürümdür. main bir çağrı tutar. down durmayı, yazdırmayı ve öz çağrıyı tutar.
public class Ladder {
public static void main(String[] args) {
down(3);
}
static void down(int n) {
if (n <= 0) {
return;
}
System.out.println(n);
down(n - 1);
}
}
Ladder.java'nın bulunduğu klasörden javac Ladder.java çalıştırın. Parantezler, süslü parantezler ve noktalı virgüller uyuşunca javac kendi satırını yazmaz. Sonra java Ladder çalıştırın — java Ladder.java değil. İkinci komuttan .java sonunu çıkarın. Aynı iki komut Windows ve macOS'ta çalışır. Program üç satır yazdırıp durmalıdır: 3, sonra 2, sonra 1. Sizden yazmanızı istememelidir. Terminal klavye girişi bekliyorsa, eski bir alıştırmadan kalan nextLine çağrısı hâlâ dosyadadır. Onu silin ve yukarıdaki down(3); ile down metodunu tutun.
Çalışmayı bir kez sırayla izleyin. Java main'den başlar. down(3) çağrısı n eşittir 3 ile girer. 0'dan büyüktür, bu yüzden metot 3 yazdırır, sonra down(2) çağırır. İkinci çağrı 2 yazdırır, sonra down(1) çağırır. Üçüncü 1 yazdırır, sonra down(0) çağırır. 0'lı çağrı n <= 0'a çarpar ve yazdırmadan döner. Zincir biter. Ekran üç yazdırılan satırı tutar.
Bu çağrıların her biri aynı metot metninden ayrı bir geçiştir. İlk geçiş down(2)'yi başlattıktan sonra hâlâ işi vardır — iç çağrı dönünce bitirmek. Dört farklı metot adı yazmazsınız. Bir metot yazarsınız ve daha küçük argümanın durmaya ilerlemeyi taşımasına izin verirsiniz.
Başlangıcı down(2); yaparsanız ekran 2 sonra 1 göstermelidir. Metot gövdesi aynı kalır; yalnızca ilk argüman değişir, bu yüzden zincir daha kısadır. down(4); ile başlamak dört satır göstermelidir: 4, 3, 2, 1. Yine gövde değişmez; yalnızca main ilk değeri seçer.
Durmayı önce koyun
Durma, yazdırmadan ve öz çağrıdan önce kontrol edilmelidir. Önce yazdırıp hiç n test etmezseniz veya her zaman aynı değerle down(n) çağırırsanız program bitmez. Bu başlangıç şeklinde if (n <= 0) bloğunu metodun üstünde tutun.
public class Ladder {
public static void main(String[] args) {
down(2);
}
static void down(int n) {
if (n <= 0) {
return;
}
System.out.println(n);
down(n - 1);
}
}
Yeniden derleyip çalıştırın: javac Ladder.java, sonra java Ladder. Ekran 2 sonra 1 gösterir. Durma n 0'a ulaşınca zinciri yine bitirir. down(n - 1) yerine down(n) yazmak aynı sayıyı tekrar tekrar gönderir. O zaman program sistem durdurana kadar çalışabilir. Daha küçük argüman fikrin parçasıdır: her çağrı durmaya doğru ilerlemelidir.
Durmayı çıkış kapısı gibi düşünün. Yazdırma bu adımın işidir. Öz çağrı sonraki adımdır. Kapı yoksa her adım sonsuz başka bir adım açar. Sonraki adım aynı n'yi kullanırsa kapıya hiç yürümezsiniz. İki hata kaynakta farklı görünür ama bu başlangıç şeklinde ikisi de temiz bitmeyi reddeder.
Ekranın yanında çağrı zinciri
Ürettiği satırların yanında bir başlangıç çağrısını okuyun. Her satır hâlâ yazdıran bir down ziyaretidir.
📊 down call chain for down(3)
| Çağrı | n değeri | Ekran satırı |
|---|---|---|
ilk down(3) |
3 |
3 |
sonra down(2) |
2 |
2 |
sonra down(1) |
1 |
1 |
sonra down(0) |
0 |
(satır yok — durma) |
Sık yapılan bir karışıklık durmayı bırakmaktır. O zaman her çağrı yazdırır ve yeniden çağırır — sonsuza. Başka bir karışıklık özyinelemeli çağrıdan sonra yazdırmaktır, öncesinde değil. Bu sayfada yazdırma önce gelir, bu yüzden ekran geri sayar. println'i down(n - 1)'in altına taşırsanız satır sırası değişir — buradaki geri sayım için yazdırmayı öz çağrının üstünde tutun.
Önceki sayfanın kapsamı hâlâ biraz önemlidir: her çağrının n'si o çağrının parametresidir. Dış çağrının n'si iç çağrı çalışınca kendini yeniden yazmaz. İç çağrının ayrı bir n'si vardır. İç çağrı dönünce dış çağrı öz çağrıdan sonraki satırdan devam eder — ve bu sayfada bu yalnızca metodun sonudur.
mark(4) içeren eski bir Gate demosu aynı dosyada kalırsa ve main hâlâ mark çağırırsa ekran karışabilir. Bu sayfayı öğrenirken main'i down(3); veya down(2);'ye indirin. down'ı main'in süslü parantezlerinin içine gömmeyin. Metotlar sınıfın içinde, main'in yanındadır.
main içinde System.out.println("down"); yazmak down sözcüğünü yazdırır. Zinciri başlatmaz. Üç geri sayım satırı istediğinizde down(3); tutun.
Bir şekil daha: durma hiçbir şey yazdırmaz
0'lı çağrının sessizce döndüğünü gördünüz. Başlangıç değeri 1 ile de pratik yapabilirsiniz. Ekran tek satır göstermelidir: 1. Sonraki çağrı duran down(0)'dır.
public class Ladder {
public static void main(String[] args) {
down(1);
}
static void down(int n) {
if (n <= 0) {
return;
}
System.out.println(n);
down(n - 1);
}
}
javac Ladder.java ve java Ladder sonrası ekran bir satır gösterir: 1. Aynı gövde down(3), down(2) ve down(1)'i kapsar. Yalnızca main'deki ilk argüman değişir. Bu başlangıç sayfası için yeterlidir. Özyinelemeden toplam döndürmek gibi daha derin fikirler sonraki kurslara kalır; burada hedef öz çağrı, daha küçük argüman ve durmadır.
Ekran hiçbir şey göstermiyorsa main'in hâlâ başka bir şey çağırıp çağırmadığına veya durma testinin yanlış olup olmadığına bakın — örneğin if (n >= 0) pozitif n ile başlamada herhangi bir yazdırmadan önce durur. Sessiz çıkış olarak n <= 0 tutun ve en az bir satır görünsün diye main'de pozitif bir başlangıç bırakın.
classes'tan önce
down(int n) yazabilir, n 0 veya daha küçükken durabilir, n yazdırıp sonra down(n - 1) çağırabilirsiniz. main'den bir çağrı tüm zinciri başlatır. Ekran geri sayım satırlarını gösterir. Durmaya hiç ilerlemeyen bir metot bitmez. Sonraki sayfa classes'tır; orada bu static metot sayfalarının ötesinde alanlı türler kurmaya başlarsınız.
🧠 Bilginizi Test Edin
Bilginizi Test Edin
Bu interaktif sınavla kendini test et ve konuyu ne kadar iyi anladığını gör
📝 Talimatlar
- Her soruyu dikkatle okuyun
- Her soru için en iyi cevabı seçin
- Quiz'i istediğiniz kadar tekrar alabilirsiniz
- İlerlemeniz üstte gösterilecek