Aynı işleve sahip yinelemeli ve özyinelemeli iki fonksiyon arasındaki performans fark [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...]
Yinelemeli yani diğer adıyla iteratif fonksiyonlar aynı işlemi defalarca tekrarlayarak sonuca ulaşmak için kullanılır. Özyinelemeli fonksiyonda ise aynı işlemi yapmak yerine yazdığımız fonksiyonu tekrardan çağırarak kendi içinde bir döngü oluşturup sonuca ulaşmamızı sağlar. İki fonksiyonun da kullanım alanları benzerdir (faktöriyel hesabı gibi) ve tek farkları aralarındaki çalışma süresi farkıdır. Biz de bu kodda bu aradaki süreyi ölçeceğiz. Özyinelemeli fonksiyonlar hakkında daha fazla bilgiye[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] tıklayarak ulaşabilirsiniz. Kod:
#include <iostream>//gerekli kütüphanemiz
#include <time.h>//time.h kütüphanemizi gerçek zamanlı ölçüm yapmada kullanacağız.
//Bu kütüphane hakkında daha fazla bilgi almak için burayı tıklayın.
using namespace std;//her satırda std:: kullanmamak için namespace kullandık.
double faktöriyel_özyinelemeli(int x)//ilk olarak özyinelemeli fonksiyonumuzu yazdık.
{
if (x<=1)
return 1;//return 1 dememizin sebebi 1 ve 0 ın faktöriyelinin yine 1 olmasıdır.
else
return (x*faktöriyel_özyinelemeli(x-1));// girilen sayının 1den büyük olması durumunda
//sayının kendisini az önce yazdığımız fonksiyonu çağırdığımızda çıkan sonuçla yani 1 eksiğiyle
//çarparak faktöriyel işlemini gerçekleştirdik.
}
double faktöriyel_yinelemeli(int x)//yinelemeli fonksiyonumuz
{ int sonuc=1;//öncelikle bir değişken yaratıp 1e eşitledik.
if (x<=1)
return 1;
else
{
while (x!=1)//döngüde ise ilk sonuçla girdiğimiz sayıyı sürekli çarparak
{ sonuc = sonuc*x;//işlemi devam ettirdik.
x=x-1;//ta ki x 1 olana kadar.
}
return sonuc;//en son işe sonucu döndürdük.
}
}
void main(void)
{
int x;
cout<<"Lütfen 0 veya 0'dan büyük bir sayı giriniz\n";
cin>>x;//x sayımızı kullanıcıdan aldık
clock_t baslangıc,bitis;//clock_t türünden 2 tane nesne yarattık
double sonuc1,sonuc2;//2 tane de double türünde değişken atadık.
baslangıc=clock();//fonksiyon çalışmaya basladığında saati aldık
cout<<faktöriyel_özyinelemeli(x)<<endl;//fonksiyonumuzu bastırarak calışmasını sağladık
bitis=clock();//fonksiyonun sonlanış saatini aldık.
sonuc1=(double)bitis-baslangıc/CLOCKS_PER_SEC;//birinci sonucumuzu bitiş saatinden başlangıç
//saatini çıkardıktan sonra /CLOCKS_PER_SEC yaparsak kaç saniyede işlemin tamamlandıgını buluruz.
//aynı zamanda burda değişken tipi değişimini de (double) koduyla sağladık.
cout<<sonuc1<<endl;//sonucumuzu bastırdık
baslangıc=clock();
cout<<faktöriyel_yinelemeli(x)<<endl;//aynı işlemleri yinelemeli fonksiyon için de yaptık.
bitis=clock();
sonuc2=(double)bitis-baslangıc/CLOCKS_PER_SEC;
cout<<sonuc2<<endl;
}
|