BPR152 ALGORİTMA VE PROGRAMLAMA - II Öğr. Gör. Bayram AKGÜL bayramakgul@bartin.edu.tr http://myo.bartin.edu.tr/akgul
Konular Recursive fonksiyonlar Temsilci fonksiyonlar Kendini çağıran fonksiyon Temsilci fonksiyonlar Paralelleştirme işlemleri Threading
Kendini Çağıran Fonksiyonlar Recursive Fonksiyon da denir. Bazı durumlarda bir fonksiyon kendini çağırabilir. C bazlı diller böyle bir duruma izin vermektedir. Örnek: Faktöriyel hesaplama n! = n * (n-1)! Fibonacci serisi Fn = Fn-1 + Fn-2
Recursive Fonksiyonların Bileşenleri Recursive fonksiyonların üç bileşeni vardır. Temel Durum Genel Durum Yakınlaşma Recursive Fonksiyon Bileşenleri Temel Durum: Basit ve Recursive olmayan durum Genel Durum: Recursive tanımlama Yakınlaşma: Temel duruma yaklaşma
Örnek Recursive: Faktöriyel Hesabı Tanım: n! = n * (n-1) * (n-2) * …. * 1 Örnek: 6! = 6 * 5 *4 *3 * 2 * 1 Temel Durum: 0! = 1 Genel Durum: n! = n * (n-1)! Yakınlaşma: Her adımda n bir azaltılıyor. static long Faktoriyel(long n) { if (n == 0) return 1; return n * Faktoriyel(n - 1); } Temel Kısım Genel Kısım Yaklaşma
Fibonacci Serisi sayıları: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, … vb. şeklinde devam eder. Her sayı kendisinden önce gelen iki sayının toplamıdır. Bu durumda genel olarak n'inci Fibonacci sayısı F(n) şeklinde ifade edilir. Bu sayıların yeterince büyük art arda gelen iki elemanını birbirleriyle oranlandığında altın oran ortaya çıkar. Örnek: F(21)/F(20)
Örnek Recursive: Fibonacci Serisi Tanım: Fn = Fn-1 + Fn-2 Dizinin ilk sayı değeri 0, ikincisi 1 ve her ardışık elemanı da önceki iki elemanın değerinin toplamı alınarak bulunur. Örnek: 0,1,1,2,3,5,8, 13,21,34,55,89,… Temel Durum: F(0) = 0; ve F(1) = 1; Genel Durum: F(n) = F(n-1) + F(n-2); Yaklaşma: Her adımda n sayısı 1 ve 2 eksiltiliyor. static long Fibonacci(long n) { if (n == 0 || n == 1) return n; return Fibonacci(n - 1) + Fibonacci(n - 2); } Temel Kısım Genel Kısım Yaklaşma Yaklaşma
Örnek Recursive: Üslü Sayı Hesabı Tanım: an = a * a * … * a Örnek: 35 = 3 * 3 *3 *3 * 3 Temel Durum: n = 0 ise sonuç 1 (a0 = 1) Genel Durum: an = a * (an-1) Yakınlaşma: Her adımda n bir azaltılıyor. n defa static long UsHesapla(long a, long n) { if (n == 0 ) return 1; return a * UsHesapla(a, n - 1); } Temel Kısım Genel Kısım Yaklaşma
Temsilci Fonksiyonlar Temsilciler metot yerine metotları temsil eden fonksiyonlardır. delegate anahtar sözcüğü ile ifade edilirler. Bir temsilci aşağıdaki şekilde yazılır: delegate geriDönüşTipi temsilciAdı([parametreler]); Örnek: delegate int Fonksiyon(int a, string b);
Temsilci fonksiyonların Tanımlanması Temsilciler genellikle programlarımıza belirli bir ifadeyle birden fazla metodu çağırabilme yeteneği vermek için kullanılır. Temsilci tanımlama: delegate double İşlem(double a, double b); Temsilci kullanma: İşlem temsilci = new İşlem(Fonksiyon); - Veya; İşlem temsilci = Fonksiyon;
Temsilci fonksiyon:Tanımlama & Kullanım using System; class Metotlar { // temsilci fonksiyonu tanımlanıyor. delegate double İşlem(double a, double b); // iki farklı metot tanımlanıyor. static double Topla(double a, double b) { return a + b; } static double Çarp(double a, double b) { return a * b; } static void Main() İşlem temsilci; double s1, s2; // temsilci Topla fonksiyonunun yerine çalışacak. temsilci = Topla; s1 = temsilci(3, 5); // temsilci Çarp fonksiyonunun yerine çalışacak. temsilci = Çarp; s2 = temsilci(3, 5); Console.WriteLine("s1 = {0}, s2={1}", s1, s2); } s1 = 8, s2=15
Temsilci fonksiyonlar ile ilgili notlar: Temsilci fonksiyonlar sadece geri dönüş tipleri ve parametreleri (sayı ve tip) kendisiyle uyumlu olan metotları temsil edebilirler. Temsilciler bir defada birden fazla metodu temsil edebilirler. Temsilciye metot eklemek veya çıkarmak için + ve – kullanılır.
Temsilciye birden fazla metot ekleme & çıkarma using System; class Temsilciler { delegate void MesajVer(string isim); static void SelamVer(string isim) { Console.WriteLine("Selam " + isim); } static void HatırSor(string isim) { Console.WriteLine(isim + " nasılsın?"); } static void Main() MesajVer m = SelamVer; m("Ali"); m = HatırSor; Console.WriteLine("*********************"); // iki metodu da ekle m = SelamVer; m += HatırSor; m("Ahmet"); // SelamVer metodunu çıkar m -= SelamVer; m("Ayşe"); } } Selam Ali Ali nasılsın? ********************* Selam Ahmet Ahmet nasılsın? Ayşe nasılsın?
Paralelleştirme işlemleri Threading olarak ifade edilir. Bir programdaki bir birinden bağımsız kısımların aynı anda ve ayrı ayrı çalıştırılması anlamına gelmektedir. Programdaki herhangi bir iş parçasına Thread denilmektedir. Her Thread kendi başına çalışmaktadır. Thread ları kullanmak için programın başına > using System.Threading; satırı eklenmelidir.
Thread Tanımlama Önce Thread ile beraber hangi metodun çalışacağı hazırlanır. Daha sonra metodun çalışmasını sağlayacak bir ThreadStart parametresi oluşturulur. ThreadStart parametresi aşağıdaki gibi oluşturulur: ThreadStart ts = new ThreadStart(HazırlananMetod); En sonunda yeni bir Thread tanımlanarak oluşturulan ThreadStart parametresi ile aşağıdaki gibi çalıştırılır: Thread t = new Thread(ts); t.Start(); // Hazırlanan metod çalışmaya başlayacaktır. Bu şekilde birçok Thread tanımlanarak aynı anda çalıştırılabilir.
Thread metodları: Thread.Start() using System; using System.Threading; class Program { static void SelamVer() while (true) Console.WriteLine("Selam!"); Thread.Sleep(500); // 500 ms = 0.5 sn uyu } static void HatırSor() Console.WriteLine("Nasılsın?"); Thread.Sleep(700); // 700 ms = 0.7 sn uyu static void Main() ThreadStart ts1 = new ThreadStart(SelamVer); Thread t1 = new Thread(ts1); t1.Start(); // SelamVer metodu çalışacak ThreadStart ts2 = new ThreadStart(HatırSor); Thread t2 = new Thread(ts2); t2.Start(); // HatırSor metodu çalışacak Thread.Start() Thread’in çalışmaya başlamasını sağlar. Thread.Sleep(milissaniye) Aktif Thread’i belirtilen süre kadar uyutur. Thread.Suspend() Aktif thread’i durdurur. Thread.Resume() Suspend ile durdurulmuş Thread’i devam ettirir. Thread.Abort() Çlışmakta olan bir Thread’i iptal eder. (durdurur.) Thread.Join() Başka bir Thread’in işleminin bitmesini bekler.
Dinlediğiniz için teşekkürler… Öğr. Gör. Bayram AKGÜL