Factorial (Faktöriyel)
Yazan : Şadi Evren ŞEKER
Bilgisayar bilimlerinde sıkça kullanılan bir örnek olan faktöriyel fonksiyonu yapısı itibari ile özyineli (recursive) bir fonksiyondur.
Yani fonksiyonun çözümünde yine kendisi cinsinden yazılma şansı vardır. Faktoriyel fonksiyonunun tanımını şu şekilde yapabiliriz:
n! = n (n-1) (n-2) … 1
Yanibasitçe faktöriyel fonksiyonu herhangi bir sayı için 1′den o sayıya kadar olan ardışık tam sayıların çarpımına eşittir.
Örneğin 5 için :
5!= 5 4 3 2 1
yani bu 5 sayının çarpımı olan 120 olarak bulunabilir.
Yukarıda iteratif olarak tanımlana faktöriyel fonksiyonunu rekürsif (özyineli) olarak tanımlamak da mümkündür.
n! = n (n-1)!
Yani bir sayının faktöriyeli o sayının bir eksiğinin faktöriyeli ile o sayının çarpımıdır. İşte bu tanım recursive (özyineli) olduğunu gösterir. Teorik olarak biliyoruz ki bütün özyineli (recursive) fonksiyonlar döngü (loop) ve bütün döngüler de özyineli fonksiyon olarak yazılabilir. Bu durumda faktöriyel fonksiyonunun çeşitli dillerdeki yazılımı aşağıda verilmiştir.
C dilinde döngü ile faktöriyel:
int sonuc=1;
for(int i = 1 ;i<=n;i++){
sonuc = sonuc * i;
}
Yukarıdaki kodda çarpmaya göre etkisiz eleman olan 1 ile başlatılan değişkenlerde sayısal sonuç döngü değişkeni olan ve 1′den n’e kadar değerler alan i değerinin çarpılarak biriktirilmesi (accumulate) sonucunda elde edilmiştir.
C dilinde özyineli olarak faktöriyel:
int fact (int n){
if(n==1)
return 1;
return n*fact(n-1);
}
Yukarıdaki kodda özyineli bir fonksiyon olan fact fonksiyonu yazılmıştır. Fonksiyonun bitiş değeri girilen sayının 1 olmasına bağlıdır. Sayı 1 olunca sonuç da 1 olmaktadır. 1′den büyük sayılar için ise sayının faktöriyel değeri sayının kendisi ile bir eksiğinin faktöriyel değerinin çarpımına eşittir.
Scheme dilinde faktöriyel
Programlama mantığı olarak özyineli olan ve dolayısıyla döngülerin tamamının yerine özyineli fonksiyon yazıldığı Lisp dilinde ve bu dilin bir türevi olan Scheme dilinde ise aşağıdaki şekilde kodlanabilir:
(define factorial
(lambda (n)
(if (= n 1) 1
(* n (factorial (- n 1))))))
Yukarıdaki kodda factorial isminde bir fonksiyon tanımlanmış ve bu fonksiyonun tek parametresi olduğu (lambda) ve isminin n olduğu belirtildikten sonra C dilindeki fonksiyonumuza benzer şekilde n değerinin 1 olması durumunda 1 diğer durumlarda ise n’in bir eksiği ile n’in çarpımı döndürülmüştür.
Prolog dilinde faktöriyel
Yapı olarak kaziye mantığı (predicate calculus) kullanan Prolog dilinde faktöriyel aşağıdaki şekilde kodlanabilir:
factorial(1,1).
factorial(N,F) :-
N>0,
N1 is N-1,
factorial(N1,F1),
F is N * F1.
Yukarıdaki kodda faktöriyel hesaplayan bir fonksiyon için N giriş değeri F ise sonuç değerini tutan değişkenlerdir. Bu fonksiyonda iki kural tanımlanmıştır.
Birinci kuralımız (ilk satır) 1 için sonucun 1olduğudur. Yani N=1 değeri sorgulandığında sonuç 1 bulunur. ikinci kuralımız ise (alttaki fonksiyon) N için F sonucunu verir.
F sonucu ise N’in 0′dan büyük olduğu değerler için N1 ismindeki ikinci değişkenin değeridir. Bu ikinci değişken ise N1′in yani N-1′in değerinin faktöriyel değeridir. Yani şimdiye kadar yazdığımız n* (n-1) mantığıdır.
« İşlem Yükleme (Operator Overloading) | Tavşan Kaplumbağa Algoritması (Hare and Tortoise Algorithm) »
Yorumlar
Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'Factorial (Faktöriyel)' isimli yazı 27 Apr 2009 tarihinde, saat: 13:39 'de Şadi Evren ŞEKER tarafından gönderilmiş, toplam 937 defa okunmuştur.
Benzer yazıları C/C++, Programlama Dilleri, Scheme (lisp) kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.
Yazarın Kitabı
Bu yazının yazarı Şadi Evren ŞEKER'in son çıkan kitabı "Programlama ve Veri Yapılarına giriş (C, C++ ve JAVA ile)" hakkında bilgi almak için Buraya tıklayabilirsiniz.
Eklenen Son Yazılar
- Visual Basic ile Gösterici (Pointer) Kullanımı
- Hasse Çizgeleri (Hasse Diagrams)
- Zeki Vekiller (Akıllı Ajanlar, Intelligent Agents, Zeki Etmenler )
- Integral Kriptoanalizi ( Toplam Tecessüsü , Integral Cryptoanalysis)
- Diferansiyel Kriptoanalizi ( Fark Tecessüsü , Differential Cryptoanalysis)
- Sierpinski Üçgeni (Sierpinski Triangle)
- C ile programlamaya giriş final sınavı çözümleri
- Çok Seviyeli Sıralar (Multi Level Queues)
- Çift Özetleme (Double Hashing)
- İkinci Dereceden Sondalama (Quadratic Probing)
Yapılan Son Yorumlar
- Şadi Evren ŞEKER: Null, NULL, nil veya null olarak...
- Fatih Kabakci: hocam merhabalar,...
- kara: Çok güzel anlatılmış gerçekten teşekkürler...
- Şadi Evren ŞEKER: Bahsettiğiniz şekil dönüşümü...
- Caner: Kullanıcıdan açı girdisi almıyorsanız...
- Furkan Yediyildiz: Algoritmanin mantigi cok güzel...
- havva: çok sağolun çok güzel açıklamalar var tşk...
- Şadi Evren ŞEKER: typedef komutu, bir yapıdan yeni bir...
- fatih kabakci: hocam ben structures ile ilgili bir sorum...
- Şadi Evren ŞEKER: evet, yukarıda açıklanan, herhangi...
- Abdurrahman ulusoy: fi açısından teta kadar döndürme...
- Şadi Evren ŞEKER: Hayır yok, bir noktanın, herhangi...
- Abdurrahman ulusoy: Bu durumda yukarıdaki formüllerin...
- Abdurrahman ulusoy: Merhaba hocam Üstteki mesajımda...
- mustafa ekmekcioğlu: merhaba şadi bey ben hacettepe...
- Şadi Evren ŞEKER: Talebiniz üzerine...
- Evren Kocaturk: ve bunu matlab üzerinde, gerekli...
- Evren Kocaturk: teşekkürler, işime yarayacak gibi,...
- tuncay çavuşoğlu: Şadi bey teşekkürler.Kısa ve...
- attila: hocam bunun bir örneginide Visual Basic diliyle...
Yakın Yazılar
Devamsal Geçiş Tarzı (Continuation-passing style, CPS)
Kuyruk Özyinelemesi (Tail Recursion, Birikimsel Tarz, Accumulation Style)
noktasal gecikme (nodal delay)
Rastgele Sayılar (Random Numbers)
Dilbilgisel Bakış (Grammatical Aspect)
Geri İzleme Algoritması (BackTracking Algorithm)
Bağlantılar