RECURSİVE OLARAK FAKTORİYEL HESABI YAPMA

Yayınlandı: Haziran 22, 2010 / Algoritmalar, C/C++
Etiketler:, , , , , , , , , ,

#include<stdio.h>
#include<conio.h>
int fac(int);
void main()
{
        int num;
        printf(“sayiyi giriniz:”);
        scanf(“%d”,&num);
        printf(“%d”,fac(num));
        getch();
}
int fac(int N)
{
        if(N<=1)
                return 1;
        return N*fac(N-1);
}
MEHMET SALİH DEVECİ

YAZILIM MÜHENDİSİ

Reklamlar
yorum
  1. Hasan MANZAK dedi ki:

    Faktöriyel hesapları için recursive yaklaşım basit, rahat fakat iteratif yaklaşıma göre yavaş ve sisteme yük getirecek bir kullanım olur. N! hesabı için recursive teknik N adet fonksiyon çağırımı yapacak ve değişkenler N defa stack a itilecektir. Faktöriyel fonksiyonunda 2 değişken olduğunu düşünürsek ( biri fonksiyon parametresi diğeri de geri dönüm değeri ) stack 2*N*SizeOf(kullanılan değişken tipi) -byte kadar şişecektir… İşlem yükü ise sadece fonksiyon içerisindeki çarpma işlemidir. Toparlarsak; sisteme binen işlem yükü: N adet fonksiyon çağırımı, N-1 adet çarpma işlemi; bellek kullanımı: 2*N*SizeOf(kullanılan değişken tipi) -byte.

    İteratif yaklaşım ile çözüme gidilirse, yapılması gereken basit bir for döngüsü kurmaktır.

    result=1;
    for k=1 to N do result=result*k;

    Bu yaklaşımla 1 adet fonksiyon çağırımı yaparak sonuç hesaplatabilirsiniz. Kullandığınız bellek miktarı ise ciddi şekilde azalmış oalcaktır: 3 adet değişken! 1. döngü kontrolü (k), 2. fonksiyon parametresi, döngü sınırı (N), 3. ise sonucun saklandığı result değeri (geri dönüm, farklı dillerde farklı yapılar mevcuttur ;)). ) -byte kadar şişecektir… İşlem yükü ise sadece fonksiyon içerisindeki çarpma işlemidir. Toparlarsak; sisteme binen işlem yükü: 1 adet fonksiyon çağırımı, N adet çarpma işlemi, 1 adet atama ve 1 adet de Inc işlemi (for döngüsü içinde k nın birer artması olayı. Derleyici seviyesinde bu işlem CPU saat darbesi ile gerçekleştirilir ve a=a+1 atamasından kat be kat daha hızlıdır ;)); bellek kullanımı: 3*SizeOf(kullanılan değişken tipi) -byte.

    Genel karşılaştırmayı yaparsak, faktöriyel hesabını iteratif olarak yaptırmak daha kârlıdır…

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s