Menu
Coddy logo textTech

Ö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.

challenge icon

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.

  1. Geri sayım için başlangıç sayısını temsil eden bir dize (string) girdisi okuyun
  2. Özel bir mesaj önekini (örneğin, "Launch in", "Timer" veya "Countdown") temsil eden bir dize girdisi okuyun
  3. İlk girdiyi int.parse() kullanarak bir tam sayıya dönüştürün
  4. İki parametre alan customCountdown adı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
  5. 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 - 1 ile çağırın
  6. Dönüştürülen sayı ve mesaj öneki ile customCountdown fonksiyonunu çağırın
  7. 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
}
quiz iconKendini test et

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