Fonksiyonlar-3

Download Report

Transcript Fonksiyonlar-3

BPR152 ALGORİTMA VE
PROGRAMLAMA - II
Öğr. Gör. Bayram AKGÜL
[email protected]
http://myo.bartin.edu.tr/akgul
Konular
• Recursive fonksiyonlar
– Kendini çağıran fonksiyon
• Temsilci fonksiyonlar
• Paralelleştirme işlemleri
– Threading
2
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
3
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
4
Ö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
5
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)
6
Ö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;
Temel Kısım
return Fibonacci(n - 1) + Fibonacci(n - 2);
Genel Kısım
}
Yaklaşma
Yaklaşma
7
Örnek Recursive: Üslü Sayı Hesabı
• Tanım: an = a * a * … * a
n defa
– Ö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.
static long UsHesapla(long a, long n)
{
Temel Kısım
if (n == 0 ) return 1;
return a * UsHesapla(a, n - 1);
Genel Kısım
}
Yaklaşma
8
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);
9
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;
10
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
11
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.
12
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;
m("Ali");
Console.WriteLine("*********************");
// iki metodu da ekle
m = SelamVer;
m += HatırSor;
m("Ahmet");
Selam Ali
Ali nasılsın?
*********************
Selam Ahmet
Ahmet nasılsın?
*********************
Ayşe nasılsın?
Console.WriteLine("*********************");
// SelamVer metodunu çıkar
m -= SelamVer;
m("Ayşe");
}
}
13
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.
14
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.
15
Thread metodları:
Thread.Start()
Thread’in çalışmaya başlamasını
sağlar.
Thread.Sleep(milissaniye)
Aktif Thread’i belirtilen süre kadar
uyutur.
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()
{
while (true)
{
Console.WriteLine("Nasılsın?");
Thread.Sleep(700); // 700 ms = 0.7 sn uyu
}
}
Thread.Suspend()
Aktif thread’i durdurur.
Thread.Resume()
Suspend ile durdurulmuş Thread’i
devam ettirir.
static void Main()
{
ThreadStart ts1 = new ThreadStart(SelamVer);
Thread t1 = new Thread(ts1);
t1.Start(); // SelamVer metodu çalışacak
Thread.Abort()
Çlışmakta olan bir Thread’i iptal eder.
(durdurur.)
Thread.Join()
Başka bir Thread’in işleminin
bitmesini bekler.
ThreadStart ts2 = new ThreadStart(HatırSor);
Thread t2 = new Thread(ts2);
t2.Start(); // HatırSor metodu çalışacak
}
}
16
DINLEDIĞINIZ IÇIN
TEŞEKKÜRLER…
Öğr. Gör. Bayram AKGÜL
17