Sunum yükleniyor. Lütfen bekleyiniz

Sunum yükleniyor. Lütfen bekleyiniz

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

Benzer bir sunumlar


... konulu sunumlar: "1 Özyinelemeli(Recursive) Algoritma Tasarımı İçerik –Tanım –Tasarım –Analiz."— Sunum transkripti:

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

2 Ö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

3 3 Böl & Yönet Stratejisi Bilgisayar birimlerinde önemli bir yere sahiptir: 1.Problemi küçük parçalara böl 2.Her bir parçayı bağımsız şekilde çöz 3.Parçaları birleştirerek ana problemin çözümüne ulaş P P1 P2 Pn P11P12 P1n... Pn1Pn2 Pnn P PPP PPP PP P PP P21... P2n P22... Temel Durum

4 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

5 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) = n ifadesini hesaplamak için Topla(n-1) = 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;

6 6 /* Topla …+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ı

7 7 Topla(4) için Özyineleme Ağacı /* Topla …+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

8 Topla(n)’nin çalışma zamanı /* Topla …+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)

9 9 a n İ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.

10 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 */

11 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)

12 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)

13 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.

14 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(35) F(40) F(40) için toplam kaç tane özyinelemeli çağrı yapılır? Cevap: den fazla yordam çağrılır.

15 Çö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

16 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

17 Uygulama 17


"1 Özyinelemeli(Recursive) Algoritma Tasarımı İçerik –Tanım –Tasarım –Analiz." indir ppt

Benzer bir sunumlar


Google Reklamları