Ö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.
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.
- Virgülle ayrılmış sayılar içeren bir dize girişi okuyun (örneğin,
"3,5,0,7") - Giriş dizesini tekil sayılara bölün ve her birini bir tam sayıya dönüştürün
ntam sayı parametresi alanfactorialadında özyinelemeli bir fonksiyon oluşturunfactorialfonksiyonu aşağıdaki mantığı uygulamalıdır:- Temel durum (Base case): Eğer
n1'e eşit veya daha küçükse, 1 döndürün - Özyinelemeli adım (Recursive step):
ndeğerinifactorial(n - 1)ile çarpılmış olarak döndürün - Giriş listesindeki her sayı için, özyinelemeli fonksiyonunuzu kullanarak faktöriyelini hesaplayın
- Her sayıyı ve karşılık gelen faktöriyelini gösteren sonuçları görüntüleyin
- 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 successfullyEğ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 successfullyEğ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 successfullyProgramı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");
}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