Özyinelemeli Fonksiyon: Geri Sayım
Coddy'nin Dart Journey'sinin Mantık & Akış bölümünün bir parçası — ders 48 / 65.
Şimdi basit bir geri sayım fonksiyonu ile özyinelemeyi (recursion) uygulamaya koyma zamanı. Bu alıştırma, temel durumun (base case) ve özyinelemeli adımın (recursive step) gerçek kodda nasıl birlikte çalıştığını anlamanıza yardımcı olacaktır.
Bir geri sayım fonksiyonu bir sayı ile başlar ve sıfıra kadar her sayıyı yazdırır. Özyinelemenin (recursion) bunu nasıl sağladığı aşağıda açıklanmıştır: eğer sayı sıfırdan büyükse, sayıyı yazdırın ve ardından aynı fonksiyonu daha küçük bir sayı ile çağırın. Sayı sıfıra ulaştığında durun.
void countdown(int number) {
if (number <= 0) {
print("Done!");
return; // Temel durum - burada dur
}
print(number);
countdown(number - 1); // Özyinelemeli adım
}Temel durum, number <= 0 olup olmadığını kontrol eder; bu, fonksiyonu çağırmayı durdurduğumuz andır. Özyinelemeli adım, aynı problemi daha küçük bir girdiyle sunan ve bizi kademeli olarak temel duruma yaklaştıran countdown(number - 1) fonksiyonunu çağırır.
countdown(3) fonksiyonunu çağırdığınızda, 3 yazdırır, ardından 2 yazdıran countdown(2) fonksiyonunu çağırır, ardından 1 yazdıran countdown(1) fonksiyonunu çağırır, ardından "Done!" yazdıran ve duran countdown(0) fonksiyonunu çağırır.
Görev
KolayÖzel mesajlar içeren özyinelemeli (recursive) bir geri sayım sayacı uygulayan bir program oluşturun. Programınız, verilen bir sayıdan geriye doğru sayarak ve her adımda kişiselleştirilmiş mesajlar görüntüleyerek özyinelemeyi gösterecektir.
- Geri sayım için başlangıç sayısını temsil eden bir dize (string) girdisi okuyun
- Özel bir mesaj önekini (örneğin,
"Launch in","Timer"veya"Countdown") temsil eden bir dize girdisi okuyun - İlk girdiyi
int.parse()kullanarak bir tam sayıya dönüştürün - İki parametre alan
customCountdownadında özyinelemeli bir fonksiyon oluşturun: - Geçerli geri sayım değerini temsil eden bir tam sayı
number - Özel mesaj için bir dize
messagePrefix - Fonksiyon aşağıdaki mantığı uygulamalıdır:
- Temel durum (Base case): Eğer sayı 0'a eşit veya daha küçükse,
"Countdown complete!"yazdırın ve geri dönün - Özyinelemeli adım (Recursive step): Mesaj önekini ve ardından geçerli sayıyı yazdırın, ardından kendisini
number - 1ile çağırın - Dönüştürülen sayı ve mesaj öneki ile
customCountdownfonksiyonunu çağırın - Sonuçları tam olarak aşağıda gösterilen formatta görüntüleyin
Örneğin, girdiler "5" ve "Launch in" ise, programınızın çıktısı şöyle olmalıdır:
Starting countdown from: 5
Message prefix: Launch in
========================
Launch in 5
Launch in 4
Launch in 3
Launch in 2
Launch in 1
Countdown complete!Girdiler "3" ve "Timer" ise, programınızın çıktısı şöyle olmalıdır:
Starting countdown from: 3
Message prefix: Timer
========================
Timer 3
Timer 2
Timer 1
Countdown complete!Girdiler "0" ve "Ready" ise, programınızın çıktısı şöyle olmalıdır:
Starting countdown from: 0
Message prefix: Ready
========================
Countdown complete!Programınız, temel duruma ulaşana kadar kendisini azaltılmış bir sayı ile çağıran özyinelemeli customCountdown fonksiyonunu uygulamalıdır. Fonksiyon, her özyinelemeli çağrıda geçerli sayı ile birlikte özel mesajı yazdırmalı ve özyinelemenin problemi nasıl daha küçük, özdeş alt problemlere böldüğünü göstermelidir. Geri sayım mesajlarını "$messagePrefix $number" şeklinde formatlamak için dize enterpolasyonu (string interpolation) kullanın.
Kopya kağıdı
Özyinelemeli (recursive) bir geri sayım fonksiyonu, bir sayıdan sıfıra doğru geri sayarak özyinelemenin nasıl çalıştığını gösterir:
void countdown(int number) {
if (number <= 0) {
print("Done!");
return; // Temel durum - burada dur
}
print(number);
countdown(number - 1); // Özyinelemeli adım
}Temel durum (base case), özyinelemeyi durdurmak için number <= 0 olup olmadığını kontrol eder. Özyinelemeli adım (recursive step), temel duruma doğru ilerleyerek aynı fonksiyonu number - 1 ile çağırır.
countdown(3) çağrıldığında, azalan değerlerle art arda özyinelemeli çağrılar yaparak 3 → 2 → 1 → "Done!" yazdırır.
Kendin dene
import 'dart:io';
// TODO: Özel geri sayım (customCountdown) fonksiyonunuzu burada oluşturun
// Temel durumu (sayı <= 0) ve özyinelemeli adımı işlemeyi unutmayın
void main() {
// Girdiyi oku
String? startingNumber = stdin.readLineSync();
String? messagePrefix = stdin.readLineSync();
// Dizeyi tam sayıya dönüştür
int number = int.parse(startingNumber!);
// Başlangıç bilgilerini görüntüle
print('Starting countdown from: $number');
print('Message prefix: $messagePrefix');
print('========================');
// TODO: Özel geri sayım (customCountdown) fonksiyonunuzu burada çağırın
// messagePrefix için null güvenliğini (null safety) işlemeyi unutmayın
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık & Akış bölümündeki tüm dersler
1İleri Düzey Liste İşlemleri
Liste Özellikleri: first & lastListe Durumu: isEmpty & isNotEmptyBir Listeyi Tersine ÇevirmeListeye Ekleme: insertListeden Silme: removeWhereListede Bulma: indexOfBir Listeyi SıralamaBir Listeyi KarıştırmaÖzet - Liste Düzenleyici4İleri Seviye Map İşlemleri
Map Üzerinde GezinmeAnahtar ve Değer KontrolüMap Özellikleri: keys & valuesKoşullu Ekleme: putIfAbsentMap'ten Öge Kaldırmaİç İçe Map'lerÖzet - Envanter Güncelleme7İleri Seviye Fonksiyonlar
Anonim FonksiyonlarFonksiyonları Argüman Olarak AktarmaClosure'ları AnlamakÖzyinelemeye GirişÖzyinelemeli Fonksiyon: Geri SayımÖzyinelemeli Fonksiyon: FaktöriyelÖzet - Liste İşleyici10Son Meydan Okumalar
Meydan Okuma: Not SıralayıcıMeydan Okuma: Sesli Harf SayacıMeydan Okuma: FizzBuzz2Fonksiyonel Liste İşlemleri
'map' ile Dönüştürme'where' ile Filtreleme'.toList()' Kullanımı'any' ile Koşul Kontrolü'every' ile Koşullar'firstWhere' ile BulmaÖzet - Veri Filtreleme5Proje: Alışveriş Sepeti Hesaplayıcı
Proje KurulumuSepete Ürün Ekleme3Kümeler
Küme Nedir?Küme OluşturmaKümelere Eleman Ekleme ve ÇıkarmaKüme İçinde Eleman KontrolüListeyi Kümeye DönüştürmeKüme BirleşimiKüme KesişimiKüme FarkıÖzet - Benzersiz Davetli Listesi