<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Recursive Fonksiyonlar arşivleri - Görkem Rıdvan ARIK</title>
	<atom:link href="https://gorkemarik.com/category/algoritma-analizi/recursive-fonksiyonlar/feed/" rel="self" type="application/rss+xml" />
	<link>https://gorkemarik.com/category/algoritma-analizi/recursive-fonksiyonlar/</link>
	<description>Yazılım Geliştirme &#38; Mühendislik</description>
	<lastBuildDate>Thu, 19 Sep 2024 17:00:07 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://gorkemarik.com/wp-content/uploads/2024/09/unnamed.jpg</url>
	<title>Recursive Fonksiyonlar arşivleri - Görkem Rıdvan ARIK</title>
	<link>https://gorkemarik.com/category/algoritma-analizi/recursive-fonksiyonlar/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Recursive (Özyinelemeli) Fonksiyon Analizi #1 Iteration Method (Tekrarlama Yöntemi)</title>
		<link>https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyon-analizi-iteration-method-tekrarlama-yontemi/</link>
					<comments>https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyon-analizi-iteration-method-tekrarlama-yontemi/#respond</comments>
		
		<dc:creator><![CDATA[Görkem Rıdvan ARIK]]></dc:creator>
		<pubDate>Tue, 17 Sep 2024 16:04:56 +0000</pubDate>
				<category><![CDATA[Algoritma Analizi]]></category>
		<category><![CDATA[Analiz]]></category>
		<category><![CDATA[Recursive Fonksiyonlar]]></category>
		<category><![CDATA[algoritma analizi]]></category>
		<category><![CDATA[iteration method]]></category>
		<category><![CDATA[recursive fonksiyon analizi]]></category>
		<category><![CDATA[tekrarlama yöntemi]]></category>
		<guid isPermaLink="false">https://gorkemarik.com/?p=289</guid>

					<description><![CDATA[<p>Iteration metodu, bir recursive denklemi çözmek için kullanılan tekniklerden biridir. T(n) denklemini ardışık adımlarla açarak, fonksiyonun kapalı formunu (closed form) elde etmeye çalışır. Bu yöntemin 5 temel adımdan oluşur.</p>
<p><a href="https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyon-analizi-iteration-method-tekrarlama-yontemi/">Recursive (Özyinelemeli) Fonksiyon Analizi #1 Iteration Method (Tekrarlama Yöntemi)</a> yazısı ilk önce <a href="https://gorkemarik.com">Görkem Rıdvan ARIK</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><strong>Giriş</strong></h4>



<p>Öz yinelemeli fonksiyonlar kendi içerisinde tekrar tekrar kendisini çağıran fonksiyonlardır. Tam da bu yüzden bu algoritmaların analizini yapmak standart fonksiyonlara göre daha zahmetlidir.</p>



<p>Algoritma analizi kapsamında recursive olmayan fonksiyonların analizi standart yöntemlerle kolay bir şekilde gerçekleştirilebilirken recursive fonksiyonlarda işler biraz karışabiliyor. Bu fonksiyonların analizini gerçekleştirmek için birkaç yöntem bulunmaktadır. Bu yazıda bir özyinelemeli algoritmanın analiz analiz yöntemlerinden bahsederek <strong>Iteration Methodu</strong> ile <strong>Hanoi Kuleleri</strong> algoritmasının analizini gerçekleştireceğiz.</p>



<p>Temel olarak 2 adım ile bu fonksiyonların analizi gerçekleştirilebilir:</p>



<ol class="wp-block-list">
<li><a href="/algoritma-analizi/recursive-ozyinelemeli-fonksiyonlarda-zaman-denklemini-bulma/">Algoritmanın zamana bağlı denkleminin <strong><em>T(n)</em></strong> elde edilmesi.</a></li>



<li>Elde edilen denklemin <strong><em>Substitution, Iterasyon, Recursion</em></strong> <strong><em>Tree</em></strong> veya <strong><em>Master </em></strong>yöntemleriyle çözülmesi.</li>
</ol>



<p>Birinci adım için daha önce yazmış olduğum <strong><em><a href="/algoritma-analizi/recursive-ozyinelemeli-fonksiyonlarda-zaman-denklemini-bulma/">Recursive (Özyinelemeli) Fonksiyonlarda Zaman Denklemini Bulma</a></em></strong> yazımı okuyabilirsiniz.</p>



<p>Bu yazıda ikinci adım olan <strong><em>T(n)</em></strong>&#8216;i bilinen bir algoritmanın <strong><em> Iteration</em></strong> teoremini kullanarak analizini gerçekleştireceğiz.</p>



<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><strong>Iteration (İterasyon-Yineleme) Metodu</strong></h4>



<p>Iteration metodu, bir recursive denklemi çözmek için kullanılan tekniklerden biridir. T(n) denklemini ardışık adımlarla açarak, fonksiyonun kapalı formunu (closed form) elde etmeye çalışır. Bu yöntemin temel adımları şu şekilde sıralanabilir:</p>



<ol class="wp-block-list">
<li><a href="#denklemin-bulunmasi">T(n) denkleminin bulunması</a></li>



<li><a href="#denklemin-acilmasi">Bulunan T(n)&#8217;in tekrar tekrar açılması</a></li>



<li><a href="#genelleme-yapilmasi">Genelleme yapılması, genel bir ifade bulunması</a></li>



<li><a href="#durdurma-kosulu">Durdurma koşulunun hesaplanması</a></li>



<li><a href="#kapali-form">Kapalı formun elde edilmesi</a></li>
</ol>



<p>Şimdi bu adımları Hanoi Kuleleri algoritması üzerinde sırayla gerçekleştireceğiz. Analize geçmeden önce kısaca Hanoi Kuleleri algoritmasına değinebiliriz.</p>



<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading"><strong>Hanoi Kuleleri Algoritması</strong></h4>



<p>Kısaca bir çubuk üzerindeki blokları diğer çubuğa en altta en büyük en üstte ise en küçük blok olacak şekilde taşınmasını hedefleyen algoritmadır ve aşağıdaki görsel ile anlatılabilir. Yalnız bu işlemi gerçekleştirmek için 2 kural bulunuyor. <strong>Her hamlede yalnızca 1 blok hareket ettirilebilir</strong> ve <strong>hiçbir hamlede küçük bir bloğun üstünde büyük bir blok olamaz.</strong></p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img fetchpriority="high" decoding="async" width="617" height="130" src="https://gorkemarik.com/wp-content/uploads/2024/09/image-5.png" alt="" class="wp-image-413" srcset="https://gorkemarik.com/wp-content/uploads/2024/09/image-5.png 617w, https://gorkemarik.com/wp-content/uploads/2024/09/image-5-300x63.png 300w" sizes="(max-width: 617px) 100vw, 617px" /></figure>
</div>


<p></p>



<p class="has-text-align-left">Bu algoritmayı koda dökecek olursak aşağıdaki gibi bir recursive fonksiyon yazabiliriz. Blokları A çubuğundan C çubuğuna taşımak istiyoruz.</p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">package main

func main() {
	hanoi(3, "A", "C", "B")
}

func hanoi(n int, from, to, aux string) {
	if n &gt;= 1 {
		hanoi(n-1, from, aux, to)
		move(from, to)
		hanoi(n-1, aux, to, from)
	}
}

func move(from, to string) {
	println("Move disk from", from, "to", to)
}</pre></div>



<p>Şimdi analiz adımlarına geçebiliriz.</p>



<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading" id="denklemin-bulunmasi"><strong><a href="#denklemin-bulunmasi">1) T(n) denkleminin bulunması</a></strong></h4>



<p>Recursive fonksiyon çağırımlarının ikisi de n-1 kez çalışacaktır. Dolayısıyla ikisine de <em>T(n-1)</em> diyebiliriz. ortadaki move fonksiyonu ise herhangi bir recursive çağırım yapmadığı için <em>O(1)</em> diyebiliriz. Oluşan ifadeleri topladığımızda T(n) denklemini <strong><em>T(n)=2T(n-1)+1</em></strong> şeklinde elde ederiz.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" width="1024" height="462" src="https://gorkemarik.com/wp-content/uploads/2024/09/image-6-1024x462.png" alt="" class="wp-image-418" srcset="https://gorkemarik.com/wp-content/uploads/2024/09/image-6-1024x462.png 1024w, https://gorkemarik.com/wp-content/uploads/2024/09/image-6-300x135.png 300w, https://gorkemarik.com/wp-content/uploads/2024/09/image-6-768x346.png 768w, https://gorkemarik.com/wp-content/uploads/2024/09/image-6.png 1178w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading" id="denklemin-acilmasi"><strong><a href="#denklemin-acilmasi">2) Bulunan T(n)&#8217;in Tekrar Tekrar Açılması</a></strong></h4>



<p>Denklemimizde O(1) yerine sabit olarak c yazabiliriz. Ardından n yerine birkaç kez fonksiyonun kendi değerini yazarak tekrar tekrar açtığımızda aşağıdaki gibi <strong><em>8T(n-3)+7c</em> </strong>ifadesini elde edeceğiz.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="608" height="248" src="https://gorkemarik.com/wp-content/uploads/2024/09/image-9.png" alt="" class="wp-image-425" srcset="https://gorkemarik.com/wp-content/uploads/2024/09/image-9.png 608w, https://gorkemarik.com/wp-content/uploads/2024/09/image-9-300x122.png 300w" sizes="(max-width: 608px) 100vw, 608px" /></figure>



<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading" id="genelleme-yapilmasi"><strong><a href="#genelleme-yapilmasi">3) Genelleme yapılması, genel bir ifade bulunması</a></strong></h4>



<p>Elde ettiğimiz <strong>T(n)=<em>8T(n-3)+7c</em></strong> ifadesini biraz düzenleyelim. 8 yerine <strong><em>2^3</em></strong> ve 7 yerine <strong><em>2^3 &#8211; 1</em></strong> yazabiliriz. İfademizin son hali şöyle olur:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="347" height="50" src="https://gorkemarik.com/wp-content/uploads/2024/09/image-12.png" alt="" class="wp-image-433" srcset="https://gorkemarik.com/wp-content/uploads/2024/09/image-12.png 347w, https://gorkemarik.com/wp-content/uploads/2024/09/image-12-300x43.png 300w" sizes="auto, (max-width: 347px) 100vw, 347px" /></figure>
</div>


<p>Fark edildiği üzere bu ifadede 3 sayısı ortak bir hale geldi. 3 yerine <strong><em>k</em></strong> yazalım. Şu ifadeyi elde ederiz:</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="417" height="56" src="https://gorkemarik.com/wp-content/uploads/2024/09/image-13.png" alt="" class="wp-image-434" srcset="https://gorkemarik.com/wp-content/uploads/2024/09/image-13.png 417w, https://gorkemarik.com/wp-content/uploads/2024/09/image-13-300x40.png 300w" sizes="auto, (max-width: 417px) 100vw, 417px" /></figure>
</div>


<p>Böylelikle ifadeyi genelleştirerek değişkenli bir hale dönüştürdük. Sonraki adıma geçebiliriz.</p>



<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading" id="durdurma-kosulu"><strong><a href="#durdurma-kosulu">4) Durdurma koşulunun hesaplanması</a></strong></h4>



<p>Durdurma koşulunun hesaplanması adımı ifadede T içerisini sıfıra eşitlemekten geçer. Yani <strong><em>n-k = 0</em></strong> ifadesini çözmemiz gerekir. Sonuç olarak <strong><em>n=k</em></strong> elde ederiz. Durdurma koşulumuzu <strong><em>n</em> </strong>olarak elde ettik. </p>



<div style="height:58px" aria-hidden="true" class="wp-block-spacer"></div>



<h4 class="wp-block-heading" id="kapali-form"><strong><a href="#kapali-form">5) Kapalı formun elde edilmesi</a></strong></h4>



<p>Son adımda ise bir önceki adıma bulduğumuz durdurma koşulunu denklemde k yerine yazmamız gerekiyor. </p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="489" height="170" src="https://gorkemarik.com/wp-content/uploads/2024/09/image-14.png" alt="" class="wp-image-438" srcset="https://gorkemarik.com/wp-content/uploads/2024/09/image-14.png 489w, https://gorkemarik.com/wp-content/uploads/2024/09/image-14-300x104.png 300w" sizes="auto, (max-width: 489px) 100vw, 489px" /></figure>
</div>


<p>Eğer T(0)=0 ise;</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="164" height="36" src="https://gorkemarik.com/wp-content/uploads/2024/09/image-15.png" alt="" class="wp-image-439"/></figure>
</div>


<p>Sabitler asimptotik büyüme hızını etkilemeyeceğinden dolayı yaptığımız analiz sonucu algoritmanın çalışma süresi <strong><em>O(2^n) </em></strong>elde edilir.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="221" height="97" src="https://gorkemarik.com/wp-content/uploads/2024/09/image-16.png" alt="" class="wp-image-440"/></figure>
</div><p><a href="https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyon-analizi-iteration-method-tekrarlama-yontemi/">Recursive (Özyinelemeli) Fonksiyon Analizi #1 Iteration Method (Tekrarlama Yöntemi)</a> yazısı ilk önce <a href="https://gorkemarik.com">Görkem Rıdvan ARIK</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyon-analizi-iteration-method-tekrarlama-yontemi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Recursive (Özyinelemeli) Fonksiyonlarda Zaman Denklemini Bulma</title>
		<link>https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyonlarda-zaman-denklemini-bulma/</link>
					<comments>https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyonlarda-zaman-denklemini-bulma/#respond</comments>
		
		<dc:creator><![CDATA[Görkem Rıdvan ARIK]]></dc:creator>
		<pubDate>Thu, 11 Apr 2024 20:26:54 +0000</pubDate>
				<category><![CDATA[Algoritma Analizi]]></category>
		<category><![CDATA[Recursive Fonksiyonlar]]></category>
		<category><![CDATA[Zaman Denklemi]]></category>
		<category><![CDATA[algoritma analizi]]></category>
		<category><![CDATA[binary search analizi]]></category>
		<category><![CDATA[binary search zaman denklemi]]></category>
		<category><![CDATA[recursive binary search]]></category>
		<category><![CDATA[recursive fonksiyon zaman denklemi]]></category>
		<category><![CDATA[zaman denklemi]]></category>
		<guid isPermaLink="false">https://gorkemarik.com/?p=294</guid>

					<description><![CDATA[<p>Recursive fonksiyonların analizini gerçekleştirebilmek için öncelikle fonksiyonun zamana bağlı denkleminin yazılması gerekmektedir. Bu makalede zamana bağlı denklemlerin nasıl yazılabileceği ele alınmıştır</p>
<p><a href="https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyonlarda-zaman-denklemini-bulma/">Recursive (Özyinelemeli) Fonksiyonlarda Zaman Denklemini Bulma</a> yazısı ilk önce <a href="https://gorkemarik.com">Görkem Rıdvan ARIK</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p></p>



<p>Recursive (özyinelemeli) algoritmaların analizini gerçekleştirme yöntemleri olan iteration, substition, master ve recurrence yöntemlerini kullanabilmek için öncellikle fonksiyonun zaman denkleminin <strong><em>T(n)</em></strong> cinsinden elde edilmesi gerekmektedir. </p>



<p>Oldukça basit bir işlem olmakla birlikte ana gereksinim analiz edilmek istenen algoritmanın çalışma mantığının kavranmasıdır. Bu makalede Binary Search algoritmasının öz yinelemeli fonksiyonu üzerinden örnekler ile <strong><em>T(n)</em></strong> denklemini elde edeceğiz.</p>



<h4 class="wp-block-heading"><strong>İzlenecek Yol</strong></h4>



<p>Örneklere geçmeden önce teorik olarak izleyeceğimiz adımlardan bahsetmek gerekirse fonksiyonumuzu satır satır okuyacağız ve çalışma mantığını anlayacağız. Daha sonra sabitler, döngüler ve kendini çağırmalar için denklem değişkenlerini yerine koyacağız.</p>



<h4 class="wp-block-heading"><strong>Binary Search Algoritmasının Zaman Denklemini Elde Etme</strong></h4>



<p></p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img decoding="async" src="https://notes.joeyh.dev/cs126/img/binsearch.png" alt=""/><figcaption class="wp-element-caption"><a href="https://notes.joeyh.dev/cs126/recursion.html" target="_blank" rel="noreferrer noopener nofollow">Görsel Kaynağı</a></figcaption></figure>
</div>


<p></p>



<p>Binary search algoritması bilindiği üzere sıralı elemanlardan oluşan sayı kümesinde bir arama işlemi gerçekleştirir. Önce kümenin tam ortasındaki elemana bakar ve aranan eleman o ise geri döndürülür. Aranan eleman ortadaki elemandan büyükse kümenin ortasından sonuna kadar olan kısmında aynı işlem tekrarlanır. Aranan eleman küçük ise de kümenin başlangıcından ortadaki elemana kadar olan kısım alınarak tekrarlanır. </p>



<p></p>



<div class="wp-block-urvanov-syntax-highlighter-code-block"><pre class="urvanov-syntax-highlighter-plain-tag">int binarySearch(int arr[], int left, int right, int x)
{
    if (right &gt;= left) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == x)
            return mid;
        if (arr[mid] &gt; x)
            return binarySearch(arr, left, mid - 1, x);
        return binarySearch(arr, mid + 1, right, x);
    }
    return -1;
}</pre></div>



<p></p>



<p>Algoritmayı anladıktan sonra koda geçecek olursak ilk önce bir if kontrolü yapılıyor. Bu sabite O(1) diyebiliriz. Bu if içerisinde ise bir değişken ataması yapılarak başka bir if kontrolü yapılmış. Bu iki satır da sabit oldukları için kendilerine O(1) diyebiliriz. </p>



<p>Sabit kısımların ardından asıl önemli kısım olan recursive kısım gelmektedir. <strong><em>if (arr[mid] > x)</em></strong> kontrolünün şartı sağlanırsa yani dizinin ortasındaki eleman aranan sayıdan büyükse fonksiyon kendisini çağırıyor ve parametre olarak dizinin ilk elemanından orta elemanına kadar olan kısım veriliyor. Yani artık eleman sayısı yarıya inmiş durumda. </p>



<p>Bu if şartı sağlanmıyor ise dizinin ortasındaki eleman aranan sayıdan küçük veya eşit demektir. Böylelikle kümenin ortasından sonuna kadar olan kısım parametre olarak verilerek aynı işlemler tekrarlanıyor. </p>



<p>İki recursive çağırım da şarta bağlı olduğundan aslında yalnızca bir kez recursive çağırım yapılıyor. Ayrıca iki çağırımda da eleman sayısı yarıya iniyor. Dolayı koddaki işaretlenmiş recursive kısmına <strong><em>T(n/2)</em></strong> diyebiliriz.</p>



<p>En sonda ise elemanın bulunmama durumunda -1 sayısı döndürülüyor. Buna da O(1) diyebiliriz.</p>



<p>Bu adımların ardından zaman denklemimizi aslında yazdık. Toparlayacak olursak toplamda 4 kez O(1) sonucuna ve 1 kere T(n/2) sonucuna ulaştık. Buna göre T(n) denklemimiz:</p>



<p><strong><em>T(n) = T(n/2) + 4O(1)</em></strong></p>



<p>Elde ederiz. O(1)&#8217;ler sabit olduğu için direkt <strong><em>c</em></strong> dersek denklemin son hali:</p>



<p><strong><em>T(n) = T(n/2) + c</em></strong></p>



<p>Elde etmiş oluruz. </p>



<h4 class="wp-block-heading"><strong>Sonuç</strong></h4>



<p>Bu yazıda Binary Search algoritmasının recurisve fonksiyonu için zaman fonksiyonunu yazdık. Özet olarak algoritmanın çalışma prensibini tespit ettikten sonra recursive çağırımların kaç kez çalıştığını saptamak denklemi yazmanın büyük bir kısmını oluşturmaktadır. Sabitler de eklenerek denklem kolayca elde edilmektedir. </p>



<p>Sonraki yazılarda bu elde ettiğimiz denklemi çeşitli yöntemler kullanarak çözerek algoritma analizini gerçekleştireceğiz.</p>
<p><a href="https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyonlarda-zaman-denklemini-bulma/">Recursive (Özyinelemeli) Fonksiyonlarda Zaman Denklemini Bulma</a> yazısı ilk önce <a href="https://gorkemarik.com">Görkem Rıdvan ARIK</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://gorkemarik.com/algoritma-analizi/recursive-ozyinelemeli-fonksiyonlarda-zaman-denklemini-bulma/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
