Anasayfa / C Programlama / Özdevingen (recursive) fonksiyon ile ikili arama metodu

Özdevingen (recursive) fonksiyon ile ikili arama metodu

Bu yazıda binary (ikili) arama algoritmasının isme göre arama yapılmasını recursive (özdevingen) fonksiyon ile yazılmasının C programlama dilinde nasıl yapıldığını anlatmaya çalışacağım.

Recursive Fonksiyon

  • Kendini doğrudan veya dolaylı olarak çağıran fonksiyonlara recursive (özdevingen) fonksiyonlar adı verilir.
  • Recursive (özdevingen), iterasyonun (döngüler, tekrar) yerine geçebilecek çok güçlü bir programlama tekniğidir.
  • Orijinal problemin küçük parçalarını çözmek için, bir alt programın kendi kendini çağırmasını sağlayarak, tekrarlı işlemlerin çözümüne farklı bir bakış açısı getirir.

İkili Arama

İkili Arama, sıralı bir dizide, belirli değerin bulunmasına yönelik bir algoritmadır. Bu teknikteki her bir adımda, aranan değerin, dizinin orta değerine eşit olup olmadığı kontrol edilir. Eşit olmaması durumunda aranan değerin orta değer tarafından ikiye ayrılan kısımlardan hangisinde olduğu kontrol edilir, aranan değeri içeren kısım bir sonraki adımda arama yapılacak dizi olur ve bu sayede arama yapılan listedeki eleman sayısı her adımda yarıya indirilmiş olur.

Uygulama

Bilmeniz gerekenler

  • C programlama struct yapısı
  • C programlama strcmp fonksiyonu (iki karakter dizisini karşılaştırır eşit ise 0, birinci ifade büyük ise 1, ikinci ifade büyük ise -1 dönderir)

Aşağıda bulunan kodu inceleyerek bu işlemlerin nasıl yapıldığını anlamaya çalışın gerekli açıklamalar kodun yorum satırında mevcuttur.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* Şair defterine programcı yorum satırına şiirini yazar
* Umut SİNAV (@umutsinav)
*/
// person isimli struct yapımızı tanımlıyoruz
struct person {
  long telNo;
  char isim[12];
};
//İkili (binary) arama algoritmasının özdevingen (recursive) sürümü
int ikiliAramaRecursive(struct person personel[], char arananIsim[], int elemanSayisi, int alt, int ust)
{
	int konum=-1, orta, karsilastir;
	if(alt>ust) return -1;
	//orta kısmı buluyoruz
	orta =  (alt + ust)  /  2;
	//isimleri karşılaştırıyoruz strcmp fonksiyonu ile
	karsilastir = strcmp(arananIsim, personel[orta].isim);
	//karşılaştırma işleminden dönen değere göre return işlemimizi yapıyoruz
	if (karsilastir==0)	return orta;
	else if (karsilastir==-1) return ikiliAramaRecursive(personel, arananIsim,  elemanSayisi, alt, orta-1);
	else if(karsilastir==1) return ikiliAramaRecursive(personel, arananIsim,  elemanSayisi, orta+1, ust);
	//aranan kayit bulunamadı ise -1 değerini dönderiyoruz
	return -1;
}
void main()
{
	struct person
    personel[15]={
		3451280, "AYDIN",
			3892345,"BEKIR",
			3774860,"CEMIL",
			3886655,"DENIZ",
            3871288,"EREN",
			3661288,"EMRAH",
            3661090,"FIKRET",
			3213045,"GUL",
			3871280,"JALE",
			3223488,"LATIF",
			3981200,"NERMIN",
            3021288,"PERIHAN",
            3891123,"UMUT",
			3125466,"VELI",
			3014560,"ZEKI"
	};
	char  girilenIsim[12];
	int elemanSayisi=15, alt=0, ust=15, sonuc, devam=0;
	//elemanları listeliyoruz
	for(int i=0; i<elemanSayisi; i++)
		printf("\n\t %d %s", personel[i].telNo, personel[i].isim);
	do
	{
		//arama yapılacak ismi kullanıcıdan alıyoruz
		printf("\n\tListede Arama Yapmak Icin Kisinin Adini Giriniz:");
		scanf("%s", &girilenIsim);
		//fonksiyonumuzu çağırıyoruz
		sonuc=ikiliAramaRecursive(personel, girilenIsim, elemanSayisi, alt, ust);
		if(sonuc==-1)
			printf("\n\t uzgunuz istediginiz ismi bulamadik :)\n");
		else
			printf("\n\t Aranan ismin konumu: %d\n\t Aranan ismin numarasi: %d\n", sonuc+1, personel[sonuc].telNo);
		printf("Tekrar arama icin [1], cikmak icin [0]:");
		scanf("%d", &devam);
		if(devam==0) exit(0);
	}while(devam);

}

 

C programlama İkili Arama Metodunun Recursive Uygulaması
C programlama İkili Arama Metodunun Recursive Uygulaması

Önerilen

Oop Nesne yönelimli programlama

Türkçesi Nesne yönelimli programlama (NYP), İngilizcesi Object Oriented Programming Özetle bir bilgisayar programlama yaklaşımıdır. Günümüzde pekçok ...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Yandex.Metrica