Menu
Coddy logo textTech

Özyinelemeli Fonksiyon: Faktöriyel

Coddy'nin Dart Journey'sinin Mantık & Akış bölümünün bir parçası — ders 49 / 65.

Bir sayının faktöriyeli, özyinelemeyi (recursion) göstermek için mükemmel olan klasik bir matematiksel işlemdir. Pozitif bir n tam sayısının faktöriyeli (n! olarak yazılır), 1'den n'ye kadar olan tüm pozitif tam sayıların çarpımıdır. Örneğin, 5! = 5 × 4 × 3 × 2 × 1 = 120.

Faktöriyeli özyineleme (recursion) için ideal kılan şey, doğal olarak daha küçük ve özdeş problemlere bölünmesidir. 5! değerini hesaplamak için bunu 5 × 4! olarak düşünebilirsiniz. Ve 4! sadece 4 × 3!'dir ve bu böyle devam eder. Bu desen, 1'e eşit olan 1! değerine ulaşana kadar devam eder.

int factorial(int n) {
  if (n <= 1) {
    return 1; // Temel durum
  }
  
  return n * factorial(n - 1); // Özyinelemeli adım
}

Temel durum, n <= 1 olduğunda özyinelemeyi durdurur ve 1 döndürür. Özyinelemeli adım, mevcut sayıyı bir sonraki küçük sayının faktöriyeli ile çarpar. factorial(5) fonksiyonunu çağırdığınızda, 5 * factorial(4) döndürür, bu da 5 * 4 * factorial(3) döndürür ve temel duruma ulaşana kadar bu şekilde devam eder.

Bu yaklaşım, problemleri aynı problemin daha basit versiyonlarına indirgeyerek özyinelemenin (recursion) problemleri nasıl zarif bir şekilde çözdüğünü gösterir ve karmaşık hesaplamaların doğal ve sezgisel hissedilmesini sağlar.

challenge icon

Görev

Kolay

Özyineleme (recursion) kullanarak birden fazla sayının faktöriyelini hesaplayan bir program oluşturun. Programınız, bir sayı listesini işleyerek ve faktöriyellerini hesaplayarak özyinelemeli faktöriyel fonksiyonunu gösterecektir.

  1. Virgülle ayrılmış sayılar içeren bir dize girişi okuyun (örneğin, "3,5,0,7")
  2. Giriş dizesini tekil sayılara bölün ve her birini bir tam sayıya dönüştürün
  3. n tam sayı parametresi alan factorial adında özyinelemeli bir fonksiyon oluşturun
  4. factorial fonksiyonu aşağıdaki mantığı uygulamalıdır:
    • Temel durum (Base case): Eğer n 1'e eşit veya daha küçükse, 1 döndürün
    • Özyinelemeli adım (Recursive step): n değerini factorial(n - 1) ile çarpılmış olarak döndürün
  5. Giriş listesindeki her sayı için, özyinelemeli fonksiyonunuzu kullanarak faktöriyelini hesaplayın
  6. Her sayıyı ve karşılık gelen faktöriyelini gösteren sonuçları görüntüleyin
  7. Tüm faktöriyel sonuçlarının toplamını hesaplayın ve görüntüleyin

Örneğin, giriş "4,3,2" ise, programınız şu çıktıyı vermelidir:

Factorial Calculator
====================
Processing numbers: [4, 3, 2]
====================
Factorial Results:
4! = 24
3! = 6
2! = 2
====================
Sum of all factorials: 32
Calculation completed successfully

Eğer giriş "5,0,1" ise, programınız şu çıktıyı vermelidir:

Factorial Calculator
====================
Processing numbers: [5, 0, 1]
====================
Factorial Results:
5! = 120
0! = 1
1! = 1
====================
Sum of all factorials: 122
Calculation completed successfully

Eğer giriş "6" ise, programınız şu çıktıyı vermelidir:

Factorial Calculator
====================
Processing numbers: [6]
====================
Factorial Results:
6! = 720
====================
Sum of all factorials: 720
Calculation completed successfully

Programınız, temel duruma ulaşana kadar kendisini azaltılmış değerlerle çağıran özyinelemeli factorial fonksiyonunu uygulamalıdır. Fonksiyon, özyinelemenin faktöriyel hesaplamasını nasıl daha küçük, özdeş alt problemlere böldüğünü göstermelidir. Faktöriyel sonuçlarını "$n! = $result" şeklinde biçimlendirmek için dize enterpolasyonu (string interpolation) kullanın. Matematiksel tanım gereği 0!'in 1'e eşit olduğunu ve temel durumunuzun bunu doğru şekilde ele alması gerektiğini unutmayın.

Kopya kağıdı

Pozitif bir n tam sayısının faktöriyeli (n! olarak yazılır), 1'den n'ye kadar olan tüm pozitif tam sayıların çarpımıdır. Örneğin, 5! = 5 × 4 × 3 × 2 × 1 = 120.

Faktöriyel, daha küçük ve özdeş problemlere bölündüğü için özyineleme (recursion) için idealdir: 5! = 5 × 4! ve 4! = 4 × 3!, bu durum 1! = 1'e ulaşana kadar devam eder.

int factorial(int n) {
  if (n <= 1) {
    return 1; // Base case
  }
  
  return n * factorial(n - 1); // Recursive step
}

Temel durum (base case), n <= 1 olduğunda özyinelemeyi durdurur ve 1 değerini döndürür. Özyinelemeli adım (recursive step), mevcut sayıyı bir sonraki daha küçük sayının faktöriyeli ile çarpar.

Kendin dene

import 'dart:io';

// TODO: Özyinelemeli (recursive) faktöriyel fonksiyonunuzu burada oluşturun

void main() {
  // Virgülle ayrılmış sayıları içeren giriş dizesini oku
  String? input = stdin.readLineSync();
  
  // Girişi böl ve tam sayılara dönüştür
  List<int> numbers = input!.split(',').map((str) => int.parse(str.trim())).toList();
  
  // TODO: Aşağıdaki işlemleri yapmak için kodunuzu yazın:
  // 1. Faktöriyel fonksiyonunuzu kullanarak her bir sayıyı işleyin
  // 2. Tüm faktöriyellerin toplamını hesaplayın
  // 3. Sonuçları istenen formatta görüntüleyin
  
  print("Factorial Calculator");
  print("====================");
  print("Processing numbers: $numbers");
  print("====================");
  print("Factorial Results:");
  
  // TODO: Faktöriyel sonuçlarını burada hesaplayın ve görüntüleyin
  
  print("====================");
  // TODO: Tüm faktöriyellerin toplamını görüntüleyin
  print("Calculation completed successfully");
}
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