Matematiğin temel taşlarından biri olan “Faktöriyel”, özellikle olasılık, kombinasyon ve permütasyon hesaplamalarında karşımıza çıkan çok güçlü bir kavramdır. Programlama dünyasına giriş yapanlar için faktöriyel hesaplama, “rekürsif” (kendi kendini çağıran) fonksiyon yapısını anlamak için kullanılan en klasik ve etkili örneklerden biridir. Bu yazımızda, Python kullanarak faktöriyel hesaplamayı ve arkasındaki mantığı detaylıca inceleyeceğiz.
🧐 Faktöriyel Nedir?
Bir pozitif tam sayının faktöriyeli, o sayıdan başlayarak 1’e kadar olan tüm pozitif tam sayıların çarpımına denir. Matematiksel olarak “!” sembolü ile gösterilir.
Örneklerle Açıklayalım:
- 5 Faktöriyel (5!)
- Hesaplama: $5 \times 4 \times 3 \times 2 \times 1 = 120$
- Sonuç: 120
- 3 Faktöriyel (3!)
- Hesaplama: $3 \times 2 \times 1 = 6$
- Sonuç: 6
- Özel Durum: 0 Faktöriyel (0!)
- Matematiksel kural gereği $0! = 1$ olarak kabul edilir.
💻 Python ile Uygulama
Faktöriyel problemini çözmek için iki temel yol vardır: döngü kullanarak (iteratif) veya fonksiyonun kendisini tekrar çağırarak (rekürsif). Bu projemizde, programlama mantığının daha derinliklerine inmek için rekürsif yaklaşımı tercih ediyoruz.
Rekürsif Mantık Nasıl Çalışır?
Rekürsif bir fonksiyon iki ana parçadan oluşur:
- Baz Durum (Base Case): Fonksiyonun duracağı noktadır. Faktöriyel için bu nokta, sayı 0 veya 1 olduğunda sonuç olarak 1 dönmesidir.
- Rekürsif Adım (Recursive Step): Fonksiyonun kendisini daha küçük bir problemle tekrar çağırdığı kısımdır. $n!$ değerini hesaplamak için $n \times (n-1)!$ işlemi yapılır.
Tam Kod Paylaşımı
İşte sade ve etkili bir şekilde faktöriyel hesaplayan Python kodumuz:
def factorial(i: int) -> int:
# Baz durum: 0 faktöriyel 1'e eşittir
if i == 0:
return 1
# Rekürsif adım: n * (n-1)!
return i * factorial(i - 1)
if __name__ == "__main__":
number = 15
result = factorial(number)
print(f"{number}! = {result}")
🛠️ Kodun Detaylı Analizi
Neden Rekürsiyon Kullandık?
Faktöriyel tanımı doğası gereği rekürsiftir. Bir sayının faktöriyelini bilmek için, ondan bir önceki sayının faktöriyelini bilmeniz gerekir. Bu tür problemlerde rekürsif kod yazmak, matematiksel tanıma çok daha yakın ve daha okunabilir bir yapı sunar.
Zaman ve Alan Karmaşıklığı
- Zaman Karmaşıklığı: $O(n)$’dir. Sayı $n$ ise, fonksiyon toplamda $n+1$ kez çağrılır.
- Alan Karmaşıklığı: $O(n)$’dir. Her rekürsif çağrı, bilgisayarın hafızasında “call stack” (çağrı yığını) adı verilen bir alanda yer kaplar. Çok büyük sayılar için bu durum
RecursionErrorhatasına yol açabilir.
🎯 Sonuç
Faktöriyel hesaplama örneği, karmaşık problemleri daha küçük parçalara bölerek çözme yeteneği kazandırır. Rekürsiyon kavramını burada kavradıktan sonra; ağaç yapılarını (tree) gezmek, hızlı sıralama (quicksort) algoritmaları veya karmaşık veri yapıları üzerinde çalışmak sizin için çok daha kolay olacaktır.
Siz de bu kodu geliştirerek, kullanıcının giriş yapabileceği bir arayüz ekleyebilir veya çok büyük sayılar için iteratif yöntemi deneyerek iki yaklaşımın performansını karşılaştırabilirsiniz!
Ahmet Aksoy
Not: Bu yazıda incelediğimiz kodu ve benzer projelerin kaynak kodlarını https://github.com/ahmetax/practical-python-examples adresinde bulabilirsiniz.