Özyinelemeli(Recursive) Algoritma Tasarımı

Slides:



Advertisements
Benzer bir sunumlar
Yığınlama Sıralaması (Heap Sort)
Advertisements

Ders İçeriği Ağaç Veri Modeli Tanım ve Gerçekleştirim İkili Ağaç
Yinelemeli Algoritma Analizi & Asimptotik Notasyon
Ayrık Yapılar Algoritma Analizi.
BPR151 ALGORİTMA VE PROGRAMLAMA - I
C ile Programlama İbrahim GAZALOĞLU HUNRobotX 2012.
Algoritmalar Ders 8 Dinamik Programlama.
Problemi Çözme Adımları
Bölüm 4 Seçme Komutları Koşul İfadesi if Komutu Bileşik Komut
Bölüm 4 İşlevlerve Modüler Programlama. 1 / 8 İşlev Tanımı /* İşlev açıklama satırı */ ( ) { }
Değişken Bildirimleri
Bölüm 4 – Kontrol İfadeleri:1.kısım
Bölüm 2: Program Denetimi
EDUTIME Java Day 4 Serdar TÜRKEL.
Soru1: kuvvet(taban,us) Şeklinde bir yinelenen fonksiyon yazın
Karar ifadeleri ve Döngüler
Recursion (Özyineleme)
Algoritmalar DERS 3 Böl ve Fethet(Divide and Conquer) İkili arama
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 3: Döngüler
Özyineli Sıralama Algoritmaları
Fortran PROGRAMLAMA DİLİ
Algoritma ve Akış Diyagramları
Yapısal Program Geliştirme – if, if-else
ALGORİTMA ve PROGRAMLAMA
BPR152 ALGORİTMA VE PROGRAMLAMA - II
Soru1: Kullanıcıdan iki tam sayı girmesini isteyen ve daha sonra büyük olan sayı ile beraber ‘en büyüktür’ ifadesi yazan, ancak sayılar birbirine eşitse.
Veri Yapıları ve Algoritmalar
BPR152 ALGORİTMA VE PROGRAMLAMA - II
JAVADA PROGRAM DENET İ M İ VE OPERATÖRLER. int a ; a=4 ; // do ğ ru bir atama 4=a ; // yanlış bir atama!
Özyineleme(Recursion)
Recursion (Özyineleme)
Fonksiyonlar Fonksiyon Tanımı Değer Döndürmeyen Fonksiyonlar
BPR152 ALGORİTMA VE PROGRAMLAMA - II Öğr. Gör. Bayram AKGÜL
Veri Yapıları ve Algoritmaları ders_1
C PROGRAMLAMA FONKSİYONLAR Adres ile Fonksiyon Çağırma Pointer (İşaretçiler) ile Fonksiyon Çağırma Rekürsif Fonksiyonlar.
PROGRAM DENETİM DEYİMLERİ
Bil 102 Bölüm 3 Java’da Program Akış Denetimi Bil 1021.
Outline 4.1 Giriş 4.2 Algoritmalar 4.3 Pseudocode 4.4 Kontrol İfadeleri 4.5 if tek-seçimli ifadeler 4.6 if else seçimli ifadeler 4.7 while döngü ifadeleri.
ENF 204 Bilgisayar Programlama Algoritma ve Akış Diyagramları
Problem Yaklaşım Temelleri, Algoritma ve Akış Şeması
PROGRAMLAMA Doç.Dr. Murat ÇAKIROĞLU 2015 – 2016 Güz Dönemi Kredi : 3+1
Bugünkü Konular Döngüler ve Akış Diyagramları C de Döngü Tanımlama
Algoritmalar ve Programlama I Ders 10: ALTPROGRAM KAVRAMI ve FONKSİYON
4. Hafta1 4. HAFTA. 4. Hafta2 Fonksiyonlar  Büyük problemler, küçük parçalara bölünerek kolay çözülür  Yazılımlar benzer modüller içerirler  Hata ayıklama.
Fonksiyonlar.
Hafta2 Rekürsif Algoritmalar
BİLGİSAYAR PROGRAMLAMA Ders 5: Döngüler
ALGORİTMA KARMAŞIKLIĞI
Algoritma ve Programlama
Algoritmalar II Ders 2 Dinamik Programlama Yöntemi.
Algoritmalar II Ders 13 Çizgelerde tüm ikililer arasında en kısa yollar.
Algoritmalar II Ders 7 Açgözlü Algoritmalar.
Algoritmalar II Ders 4 Dinamik Programlama Yöntemi.
Algoritmalar II Ders 14 Çizgelerde tüm ikililer arasında en kısa yollar.
BİLGİSAYAR PROGRAMLAMA Ders 5: Döngüler
FONKSİYONLAR Programlamada fonksiyon kullanmanın en önemli sebebi kodların tekrar edilmesini engellemektir. Örneğin; karekök yada üsalma işlemi yapan bir.
9. Ders Tüm ikililer arasında en kısa yollar
Bilgisayar Programlama
PROGRAMLAMAYA GİRİŞ FORTRAN 77.
Bilgisayar Bilimi Problem Çözme Süreci-2.
YAPISAL PROGRAMLAMA Hafta-7
Recursion (Özyineleme)
Algoritma ve Akış Diyagramları
Algoritmalar II Ders 9 Dinamik Programlama ve Açgözlü Yaklaşım Soruları.
Algoritmalar II Ders 3 Dinamik Programlama Yöntemi.
Bilgisayar Bilimi Fonksiyonlar-2.
MTM216 GÖRSEL PROGRAMLAMA
Algoritmalar II Ders 2 Dinamik Programlama Yöntemi.
10. Ders Floyd-Warshal algoritması
Sunum transkripti:

Ö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. Özyineleme güçlü bir problem çözme mekanizmasıdır. Çoğu algoritma kolayca özyinelemeli şekilde çözülebilir. Fakat sonsuz döngü yapmamaya dikkat edilmeli.

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

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

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;

N’ye Kadar Olan Sayıların Toplamı /* 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 */

Topla(4) için Özyineleme Ağacı main /* 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 */ =10 return 6+4 x=Topla(4) Topla(4) araToplam=Topla(3) =6 return 3+3 Topla(3) araToplam=Topla(2) =3 return 1+2 Topla(2) araToplam=Topla(1) =1 Topla(1) return 1

Topla(n)’nin çalışma zamanı 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 */ n =1  1 (Temel durum) T(n) = n > 1  T(n-1) + 1

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 */ Böl yönet & birleştir işlemlerini bir ifade ile yapılabilir. /* 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 */

Ust(3, 4) için Özyineleme ağacı main /* 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 */ =81 return 81 x=Ust(3,4) Ust(3,4) return 3*Ust(3,3) =81 return 27 Ust(3,3) return 3*Ust(3,2) =27 return 9 Ust(3,2) return 3*Ust(3,1) =9 Ust(3,1) return 3

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 */ n <= 1  1 (Temel durum) T(n) = N > 1 T(n-1) + 1

Fibonacci Sayıları Fibonacci sayılarını tanımlayacak olursak: F(0) = 0 F(n) = F(n-1) + F(n-2) /* 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ı (devam) 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. /* 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ı (devam) ................................................................................................................. F(40) için toplam kaç tane özyinelemeli çağrı yapılır? Cevap: 300 000 000 den fazla yordam çağrılır.

Çö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ı. /* 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;

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.

Uygulama