Özyinelemeli(Recursive) Algoritma Tasarımı

17
1 Özyinelemeli(Recursive) Algoritma Tasarımı • İçerik – Tanım – Tasarım – Analiz

description

Özyinelemeli(Recursive) Algoritma Tasarımı. İçerik Tanım Tasarım Analiz. Özyinelemeli(Recursive) Yordam. Tanım: Özyinelemeli yordam doğrudan veya dolaylı olarak kendisini çağıran yordamdır. Gerçek hayatta kullanılan örnekler: Dizindeki dosyalar üzerinde dolaşma Programlama dilleri v.b. - PowerPoint PPT Presentation

Transcript of Özyinelemeli(Recursive) Algoritma Tasarımı

Page 1: Özyinelemeli(Recursive) Algoritma Tasarımı

1

Özyinelemeli(Recursive) Algoritma Tasarımı

• İçerik– Tanım– Tasarım– Analiz

Page 2: Özyinelemeli(Recursive) Algoritma Tasarımı

Özyinelemeli(Recursive) Yordam

• Tanım: Özyinelemeli yordam doğrudan veya dolaylı olarak kendisini çağıran yordamdır.

• Gerçek hayatta kullanılan örnekler:– Dizindeki dosyalar üzerinde dolaşma– Programlama dilleri v.b.

• Özyineleme güçlü bir problem çözme mekanizmasıdır.– Çoğu algoritma kolayca özyinelemeli şekilde

çözülebilir.– Fakat sonsuz döngü yapmamaya dikkat edilmeli.

2

Page 3: Özyinelemeli(Recursive) Algoritma Tasarımı

3

Böl & Yönet Stratejisi• Bilgisayar birimlerinde önemli bir yere

sahiptir:1. Problemi küçük parçalara böl2. Her bir parçayı bağımsız şekilde çöz3. Parçaları birleştirerek ana problemin çözümüne

ulaş P

P1 P2 Pn

.................................................................................................................

...............................

P11

P12

P1n

...Pn1

Pn2

Pnn

P P P P P P P P PP P P

P21

... P2nP22

...

Tem

el

Duru

m

...................

......

................

...

Page 4: Özyinelemeli(Recursive) Algoritma Tasarımı

4

Böl & Yönet Stratejisi (devam)/* P problemini çöz */Solve(P){ /* Temel durum(s) */ if P problemi temel durumda ise return çözüm /* (n>=2) için P yi P1, P2, ..Pn şeklinde parçalara böl */ /* Problemleri özyinelemeli şekilde çöz */ S1 = Solve(P1); /* S1 için P1 problemini çöz */ S2 = Solve(P2); /* S2 için P2 problemini çöz*/ … Sn = Solve(Pn); /* Sn için Pn problemini çöz */

/* Çözüm için parçaları birleştir. */ S = Merge(S1, S2, …, Sn);

/* Çözümü geri döndür */ return S;} //bitti-Solve

Page 5: Özyinelemeli(Recursive) Algoritma Tasarımı

5

N’ye Kadar Olan Sayıların Toplamı

• Problemimizin 1’den n’ye kadar sayıların toplamı olduğunu varsayalım.

• Bu problemi özyinelemeli nasıl düşüneceğiz:– Topla(n) = 1+2+..+n ifadesini hesaplamak için

• Topla(n-1) = 1+2+..+n-1 ifadesini hesapla (aynı türden daha küçük bir problem)

• Topla(n-1) ifadesine n ekleyerek Topla(n) ifadesi hesaplanır.

• Ö.g., Topla(n) = Topla(n-1) + n;

– Temel durumu belirlememiz gerekiyor.• Temel durum, (alt problem) problemi bölmeye gerek

kalmadan kolayca çözülebilen problemdir.• n = 1 ise, Topla(1) = 1;

Page 6: Özyinelemeli(Recursive) Algoritma Tasarımı

6

/* Topla 1+2+3+…+n */int Topla(int n){ int araToplam = 0;

/* Temel durum */ if (n == 1) return 1;

/* Böl ve Yönet */ araToplam = Topla(n-1);

/* Birleştir */ return araToplam + n; } /* bitti-Topla */

Public ... main(...){ int x = 0;

x = Topla(4); print(“x: ”+ x);

return 0;} /* bitti-main */

N’ye Kadar Olan Sayıların Toplamı

Page 7: Özyinelemeli(Recursive) Algoritma Tasarımı

7

Topla(4) için Özyineleme Ağacı

/* Topla 1+2+3+…+n */int Topla(int n){ int araToplam = 0;

/* Temel Durum */ if (n == 1) return 1;

/* Böl ve Yönet */ araToplam = Topla(n-1);

/* Birleştir */ return araToplam + n; } /* bitti-Topla */

Public ... main(...){ int x = Topla(4); print(“Topla: ”+ Topla(4));} /* bitti-main */

Topla(4)

x=Topla(4)

main

araToplam=Topla(3)

Topla(3)

araToplam=Topla(2)

Topla(2)

araToplam=Topla(1)

Topla(1)

return 1

=1

=3

return 1+2

=6

return 3+3

=10

return 6+4

Page 8: Özyinelemeli(Recursive) Algoritma Tasarımı

Topla(n)’nin çalışma zamanı/* Topla 1+2+3+…+n */int Topla(int n){ int araToplam = 0;

/* Temel durum */ if (n == 1) return 1;

/* Böl ve yönet */ araToplam = Topla(n-1);

/* Birleştir */ return araToplam + n; } /* bitti-araToplam */

T(n) = n > 1 T(n-1) + 1

n =1 1 (Temel durum)

Page 9: Özyinelemeli(Recursive) Algoritma Tasarımı

9

an İfadesini Hesaplama

/* a^n hesapla */double Ust(double a, int n){ double araSonuc;

/* Temel durum */ if (n == 0) return 1; else if (n == 1) return a;

/* araSonuc = a^(n-1) */ araSonuc = Ust(a, n-1);

/* Birleştir */ return araSonuc*a; } /* bitti-Ust */

/* Hesapla a^n */double Ust(double a, int n){ /* Temel durum */ if (n == 0) return 1; else if (n == 1) return a;

return Ust(a, n-1)*a;} /* bitti-Ust */

• Böl yönet & birleştir işlemlerini bir ifade ile yapılabilir.

Page 10: Özyinelemeli(Recursive) Algoritma Tasarımı

10

Ust(3, 4) için Özyineleme ağacı

Ust(3,4)

x=Ust(3,4)

main

return 3*Ust(3,3)

Ust(3,3)

return 3*Ust(3,2)

Ust(3,2)

return 3*Ust(3,1)

Ust(3,1)

return 3

=9

=27

return 9

=81

return 27

=81

return 81

/* Hesapla a^n */double Ust(double a, int n){ /* Temel durum */ if (n == 0) return 1; else if (n == 1) return a;

return a * Ust(a, n-1);} /* bitti-Ust */

Public ... main(...){ double x;

x = Ust(3, 4);} /* bitti-main */

Page 11: Özyinelemeli(Recursive) Algoritma Tasarımı

Ust(a, n)’nin Çalışma Zamanı/* Hesapla a^n */double Ust(double a, int n){ /* temel durum */ if (n == 0) return 1; else if (n == 1) return a;

return a * Ust(a, n-1);} /* bitti-Ust */

T(n) = N > 1 T(n-1) +

1

n <= 1 1 (Temel durum)

Page 12: Özyinelemeli(Recursive) Algoritma Tasarımı

12

Fibonacci Sayıları

/* n. Fibonacci sayısını hesaplama*/int Fibonacci(int n){ /* Temel durum */ if (n == 0) return 0; if (n == 1) return 1;

return Fibonacci(n-1) + Fibonacci(n-2);} /* bitti-Fibonacci */

• Fibonacci sayılarını tanımlayacak olursak:– F(0) = 0– F(1) = 1– F(n) = F(n-1) + F(n-2)

Page 13: Özyinelemeli(Recursive) Algoritma Tasarımı

13

Fibonacci Sayıları (devam)

/* n. Fibonacci sayısını hesaplama*/int Fibonacci(int n){ /* Temel durum */ if (n == 0) return 0; if (n == 1) return 1;

return Fibonacci(n-1) + Fibonacci(n-2);} /* bitti-Fibonacci */

• Fibonacci sayılarının tanımı özyinelemelidir. Dolayısıyla problemi çözmek için özyinelemeli çözmek doğal olarak gözükebilir.

• Örneğin 40. fibonacci değerini bulmaya çalışalım.

Page 14: Özyinelemeli(Recursive) Algoritma Tasarımı

14

Fibonacci Sayıları (devam)

F(39)

F(38)

F(34)

F(38)

F(37)

F(36)F(37) F(36)

F(37)

F(35) F(36)

F(36)

F(35)F(35)

F(40)

........................................................................................

......................... F(40) için toplam kaç tane özyinelemeli çağrı yapılır?

Cevap: 300 000 000 den fazla yordam çağrılır.

Page 15: Özyinelemeli(Recursive) Algoritma Tasarımı

Çözüm - yinelemeli algoritma• Basit bir "for" ile çözülebilecek problemler

için özyinelemeli algoritmalar kullanılmaz.• Fibonacci sayıları için yinelemeli

algoritmalar kullanılmalı.

15

/* n. Fibonacci sayısını hesaplama*/public static int fibonacci(int n){ if(n == 1 || n == 2) return 1;

int s1=1,s2=1,sonuc=0; for(int i=0; i<n; i++){ sonuc = s1 + s2; s1 = s2; s2 = sonuc; } return sonuc;}

Page 16: Özyinelemeli(Recursive) Algoritma Tasarımı

Yapılan Genel Hatalar• Özyinelemeli yordamın temel durumunu

unutulmamalı• Basit bir for yerine özyinelemeli yordam

kullanmak iyi bir fikir değildir.• Özyinelemeli algoritmanın bitiş şartı

temel durumda verilir. Buradaki bir hata özyinelemeli algoritmanın hatalı olmasına neden olur.

16

Page 17: Özyinelemeli(Recursive) Algoritma Tasarımı

Uygulama

17