<?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>Bilgisayar Kavramları &#187; Scheme (lisp)</title>
	<atom:link href="http://www.bilgisayarkavramlari.com/category/scheme-lisp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bilgisayarkavramlari.com</link>
	<description>www.bilgisayarkavramlari.com</description>
	<lastBuildDate>Sun, 29 Jan 2012 21:38:15 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Polynomials (Çokterimliler)</title>
		<link>http://www.bilgisayarkavramlari.com/2009/08/10/polynomials-cokterimliler/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/08/10/polynomials-cokterimliler/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 13:55:20 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Matematiği]]></category>
		<category><![CDATA[Scheme (lisp)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/?p=3156</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Pekçok temel bilim ve mühendislik için oldukça önemli olan polinomlar (çok terimliler) basitçe bir değerin tek bilinmyenli farklı üssel terimlerle ifade edilmesidir. Bir polinomda toplama, çıkarma ve çarpma işlemleri bulunabilir. Bir polinomun herhangi bir bilinmeyen değerinin bölme işleminde bölen olması (rasyonel sayının paydası olması) durumunda bu ifade polinom olmaktan çıkar. [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Pekçok temel bilim ve mühendislik için oldukça önemli olan polinomlar (çok terimliler) basitçe bir değerin tek bilinmyenli farklı üssel terimlerle ifade edilmesidir. Bir polinomda toplama, çıkarma ve çarpma işlemleri bulunabilir. Bir polinomun herhangi bir bilinmeyen değerinin bölme işleminde bölen olması (rasyonel sayının paydası olması) durumunda bu ifade polinom olmaktan çıkar.</p>
<p>Örneğin</p>
<p>3x<sup>2</sup> + x/2 + 4 ifadesi bir polinomdur</p>
<p>3x<sup>2</sup> + 2/x + 4 ifadesi ise bir polinom değildir çünkü bilinmeyen değer paydada gösterilmiştir.</p>
<p>Diğer bir ifadeyle polinomlardaki bilinmeyenlerin üstleri tam sayı olmalıdır.</p>
<p>Bir polinomun derecesi, polinomdaki en yüksek üstteki bilinmeyenin derecesi kadardır.</p>
<p>Örneğin</p>
<p>3x<sup>7</sup> + 2x<sup>3</sup> + 2x + 5</p>
<p>polinomunundaki en yüksek dereceli terim 3x<sup>7</sup>&#8216;dir ve dolayısıyla polinomun derecesi 7&#8242;dir.</p>
<p><strong>Polinom fonksiyonları</strong></p>
<p>Bir polinomun <a href="http://www.bilgisayarkavramlari.com/2008/10/12/fonksiyon-function/">fonksiyonel</a> olarak gösterilmesi, bu polinomun belirli bir değer için çözümünün bulunması demektir.</p>
<p>Örneğin</p>
<p>f(x) = 3x<sup>2</sup> + 5x + 7</p>
<p>olarak tanımlanmış bir <a href="http://www.bilgisayarkavramlari.com/2008/10/12/fonksiyon-function/">fonksiyon</a>, anlaşılacağı üzere bir polinom fonksiyonudur çünkü fonksiyonun tanımı bir polinom ile ifade edilmiştir. Fonksiyon çözümü ise değişken yerleştirerek yapılır.</p>
<p>Örneğin yukarıdaki <a href="http://www.bilgisayarkavramlari.com/2008/10/12/fonksiyon-function/">fonksiyon</a> için f(2) çözümü:</p>
<p>f(2) = 32<sup>2</sup> + 52 + 7</p>
<p>f(2) = 12 + 10 + 7</p>
<p>f(2) = 29</p>
<p>olarak bulunur.</p>
<p><strong>Polinom gösterimleri</strong></p>
<p>Polinomlar cebirsel olarak işlemlere tabi tutularak farklı gösterimlere sokulabilir.</p>
<p>Örneğin ( x + 1 ) <sup>2</sup> ifadesi bir polinomdur ve açıldığında</p>
<p>2x<sup>2</sup> + 2x + 1 polinomu bulunur. Görüldüğü üzere iki farklı gösterim de aynı değeri ifade etmektedir.</p>
<p>Bu gösterimin yanında bilgisayar programlamasında kolaylık sağlaması açısından polinomlar sadece çarpanların tutulduğu diziler olarak da gösterilebilir.</p>
<p>Örneğin</p>
<p>2x<sup>2</sup> + 2x + 1 polinomunu bir <a href="http://www.bilgisayarkavramlari.com/2007/05/04/array-dizi/">dizide (array)</a> tutarken 2,2,1 olarak tutmak işlem kolaylığı sağlamaktadır.</p>
<p>Polinomlar yüksek dereceli terimden başlanarak tutulabileceği gibi düşük dereceli terimden başlanarak da tutulabilir.</p>
<p>Örneğin</p>
<p>2x<sup>2</sup> + 2x + 1 polinomu bir önceki örneğe benzer şekilde 1,2,2 şeklinde en düşük dereceli terimden başlanarak da tutulabilir.</p>
<p>Yukarıdaki bu dizide tutma işlemlerinin bir dezavantajı eksik terimlerin yer kaplamasıdır.</p>
<p>Örneğin</p>
<p>2&#215;7 + 2x +1 şeklindeki bir polinomu dizide tutarken 2,0,0,0,0,2,1 şeklinde tutmak gerekir. Burada aslında çarpanı 0 olan 6.,5.,4. ve 3. üs dereceleri de gösterilmek zorunda kalmıştır ve bu bilgi yer kaplar.</p>
<p>Bu boş bilginin tutulmasını engellemek için polinomların üst değerleri ile bilrlikte tutulması mümkündür.</p>
<p>Örneğin</p>
<p>2x<sup>22</sup> + 2x<sup>11</sup> + 2x + 2 polinomunu şu şekilde düşünebiliriz.</p>
<p>(( 2,22) , ( 2,11 ) , (2,1) , (2,0))</p>
<p>Yani değişkenin 22. kuvvetinin çarpanı 2&#8242;dir veya 0. kuvvetinin çarpanı 2&#8242;dir şeklinde gösterilebilir.</p>
<p>Burada dikkat edilirse bir önceki sıralı gösterime göre daha az yer kaplanmıştır (Sıralı gösterimde 22 terim tutulması gerekirken yukarıda sadece 8 terim tutulmuştur).</p>
<p>Yukarıdaki iç içe liste yapısı list (scheme) gibi programlama dillerinde kolaylıkla gösterilebilirken C,C++, C# veya JAVA gibi dillerde gösterim için dizi kullanma meburiyeti sonucunda örneğin bir dizinin tek elemanları ve çift elemanları yukarıdaki bilgiyi tutacak şekilde tasarlanabilir. Bu durumda yukarıdaki örnek polinomu aşağıdaki şekilde bir <a href="http://www.bilgisayarkavramlari.com/2007/05/04/array-dizi/">dizide (array)</a> tutabiliriz:</p>
<p>2,22,2,11,2,1,2,0</p>
<p>Yukarıdaki dizide 0,2,4,6 gibi çift sayılı elemanlar çarpanları tutarken, 1,3,5,7 numaralı elemanlar üstleri tutmaktadır.</p>

<p class="sayac_bilgi">162 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/08/10/polynomials-cokterimliler/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Anlambilimsel Tertip (Semantic Composition)</title>
		<link>http://www.bilgisayarkavramlari.com/2009/06/17/anlambilimsel-tertip-semantic-composition/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/06/17/anlambilimsel-tertip-semantic-composition/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 13:04:57 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Doğal Dil İşleme (NLP)]]></category>
		<category><![CDATA[Scheme (lisp)]]></category>
		<category><![CDATA[yapay zeka (artificial intelligence)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/?p=2566</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Doğal dil işleme çalışmaları sırasında bir metinden (derlem (corpus) , paragraf , cümle veya kelimeden) çıkarılan anlamın bilgisayar tarafından bir şekilde modellenmesi gerekmektedir. Bu modelleme sırasında kullanılan gösterim çeşitlerine anlambilimsel tertip ismi verilir. Anlambilimsel dilbilgisi (semantic grammer) kadar kesin kuralları olmayan bu gösterim şekillerinde çoğu zaman doğru veya yanlış kaygısı [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Doğal dil işleme çalışmaları sırasında bir metinden (<a href="http://www.bilgisayarkavramlari.com/2008/03/25/kulliyat-corpus/">derlem (corpus)</a> , paragraf , cümle veya kelimeden) çıkarılan anlamın bilgisayar tarafından bir şekilde modellenmesi gerekmektedir.</p>
<p>Bu modelleme sırasında kullanılan gösterim çeşitlerine anlambilimsel tertip ismi verilir. <a href="http://www.bilgisayarkavramlari.com/2009/06/17/anlambilimsel-tertip-semantic-composition/">Anlambilimsel dilbilgisi (semantic grammer)</a> kadar kesin kuralları olmayan bu gösterim şekillerinde çoğu zaman doğru veya yanlış kaygısı güdülmeden sadece bir bilginin gösterimi hedeflenir.</p>
<p>Anlambilimsel tertipleri <a href="http://www.bilgisayarkavramlari.com/2009/06/17/sozdizim-syntax/">cümle gösterimlerinin (Syntactic representation)</a> ötesinde fonksiyonel ve çalışabilir tertipler olarak görmekte yarar vardır.</p>
<p>Örneğin en çok kullanılan ve en etkili gösterimlerden birisi <a href="http://www.bilgisayarkavramlari.com/2010/03/24/birinci-derece-mantik-first-order-logic/">birinci derece haber mantığıdır (first order predicate logic).</a> Bu mantığa göre örneğin aşağıdaki şekilde bir gösterim yapılabilir.</p>
<p>&#8220;Ali uyudu&#8221; şeklindeki bir cümleyi ele alalım. Bu cümleden aşağıdaki şekilde birinci derece haber mantığı gösterimi elde edilebilir:</p>
<pre>uyudu(Ali).</pre>
<p>Basitçe uyudu isminde bir fonksiyonumuz varsa bu fonksiyonun parametresi de Ali olmaktadır. Bu durum özellikle birinci derece haber mantığını kullanan diller için çok önemlidir. Örneğin PROLOG yukarıdaki bu satırı doğrudan kod olarak kabul edip çalıştırabilir.</p>
<p>Farklı bir örnek olarak lambda matematiğinde (lambda calculus) modelleme yapmaya çalışalım.</p>
<p>&#8220;Ali peynir yedi&#8221; şeklindeki bir cümleyi lambda matematiği ile modellersek:</p>
<pre>(λa) (λb) yedi (a,b)</pre>
<p>şeklinde gösterebiliriz. Yukarıdaki bu gösterimde modelimizde bulunan <a href="http://www.bilgisayarkavramlari.com/2008/09/08/degisken-variable/">değişkenler (variables)</a> birer lambda değişkeni olarak tanımlanmıştır. Yani yukarıdaki gösterime göre a ve b isminde iki değişken yedi fonksiyonunun parametresidir. Benzer bir durum için:</p>
<pre>(λa) yedi (a,peynir)
(λb) yedi (ali,b)</pre>
<p>şeklinde bir gösterim de yapılabilir. Yukarıdaki ilk satırda &#8220;peynir yemek&#8221; eylemi modellenirken ikinci satırda Ali tarafından yenilen şeyler modellenmiştir.</p>
<p>Lamda matematiğindeki bu gösterim de LISP (veya Scheme) gibi bu gösterimi doğrudan kullanan diller için oldukça önemlidir.</p>
<p>Yukarıdaki örneklere ilave olarak modelin daha detaylı hale getirilmesi de mümkündür. Örneğin yukarıdaki cümlelerde fiil zaman, şahıs, kip gibi bilgilerinden arındırılmadan olduğu gibi fonksiyon haline çevrilmiştir. Oysaki bu bilgilerin de modelde birer gösterimi bulunabilir.</p>
<pre>uyumak (Ali, geçmiş).</pre>
<p>Yukarıdaki birinci derece haber mantığında gösterilen satıra göre Ali uyuma eylemini geçmişte yapmıştır. Elbette bu gösterim daha önceki gösterime göre daha detaylıdır ve doğal dil işlemesi yapacak bilgisayar için daha kıymetlidir çünkü ilk gösterimde bilgisayarın olay zamanı hakkında fikri yokken artık olayın zamanını parametre olarak almaktadır.</p>
<p>Ancak burada bir problem olayın modellenmesi sırasnda kullanılan yöntemin ne kadar bilgi içerebileceğidir. Örneğin yukarıdaki gösterime göre uyuma eyleminin geçmişte olduğunu tutuyoruz ancak bilindiği üzere &#8220;uyudu&#8221; fiili aslında söyleyen kişinin uyuma eylemi yapılırken orada olduğunu göstermektedir (örneğin uyumuş fiili de geçmiş zamanlıdır). Dolayısıyla bu ilave bilginin de tutulması gerekir.</p>
<p>Yukarıdaki basit örnekten anlaşılacağı üzere bir anlambilimsel model geliştirildiğinde ve kullanılırken doğal dilde çok basit ve kısa ifadelerle anlatılabilen bilgilerin analiz edilip çeşitli alternatifler ile bir ortamda tutulması gerekir.</p>

<p class="sayac_bilgi">111 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/06/17/anlambilimsel-tertip-semantic-composition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Factorial (Faktöriyel)</title>
		<link>http://www.bilgisayarkavramlari.com/2009/04/27/1863/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/04/27/1863/#comments</comments>
		<pubDate>Mon, 27 Apr 2009 10:39:01 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[Scheme (lisp)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2009/04/27/1863/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Bilgisayar bilimlerinde sıkça kullanılan bir örnek olan faktöriyel fonksiyonu yapısı itibari ile özyineli (recursive) bir fonksiyondur. Yani fonksiyonun çözümünde yine kendisi cinsinden yazılma şansı vardır. Faktoriyel fonksiyonunun tanımını şu şekilde yapabiliriz: n! = n (n-1) (n-2) &#8230; 1 Yanibasitçe faktöriyel fonksiyonu herhangi bir sayı için 1&#8242;den o sayıya kadar olan [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Bilgisayar bilimlerinde sıkça kullanılan bir örnek olan faktöriyel fonksiyonu yapısı itibari ile <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">özyineli (recursive)</a> bir fonksiyondur.</p>
<p>Yani fonksiyonun çözümünde yine kendisi cinsinden yazılma şansı vardır. Faktoriyel fonksiyonunun tanımını şu şekilde yapabiliriz:</p>
<p>n! = n (n-1) (n-2) &#8230; 1</p>
<p>Yanibasitçe faktöriyel fonksiyonu herhangi bir sayı için 1&#8242;den o sayıya kadar olan ardışık tam sayıların çarpımına eşittir.</p>
<p>Örneğin 5 için :</p>
<p>5!= 5 4 3 2 1</p>
<p>yani bu 5 sayının çarpımı olan  120 olarak bulunabilir.</p>
<p>Yukarıda iteratif olarak tanımlana faktöriyel fonksiyonunu rekürsif (özyineli) olarak tanımlamak da mümkündür.</p>
<p>n! = n (n-1)!</p>
<p>Yani bir sayının faktöriyeli o sayının bir eksiğinin faktöriyeli ile o sayının çarpımıdır. İşte bu tanım recursive (özyineli) olduğunu gösterir. Teorik olarak biliyoruz ki bütün özyineli (recursive) fonksiyonlar <a href="http://www.bilgisayarkavramlari.com/2008/09/08/dongu-loop/">döngü (loop)</a> ve bütün döngüler de özyineli fonksiyon olarak yazılabilir. Bu durumda faktöriyel fonksiyonunun çeşitli dillerdeki yazılımı aşağıda verilmiştir.</p>
<p><strong>C dilinde döngü ile faktöriyel:</strong></p>
<pre>int sonuc=1;</pre>
<pre>   for(int i = 1 ;i&lt;=n;i++){</pre>
<pre>      sonuc = sonuc * i;</pre>
<pre>}</pre>
<p>Yukarıdaki kodda çarpmaya göre etkisiz eleman olan 1 ile başlatılan değişkenlerde sayısal sonuç döngü değişkeni olan ve 1&#8242;den n&#8217;e kadar değerler alan i değerinin çarpılarak biriktirilmesi (accumulate) sonucunda elde edilmiştir.</p>
<p><strong>C dilinde özyineli olarak faktöriyel:</strong></p>
<pre>int fact (int n){</pre>
<pre>   if(n==1)</pre>
<pre>      return 1;</pre>
<pre>   return n*fact(n-1);</pre>
<pre>}</pre>
<p>Yukarıdaki kodda özyineli bir fonksiyon olan fact fonksiyonu yazılmıştır. Fonksiyonun bitiş değeri girilen sayının 1 olmasına bağlıdır. Sayı 1 olunca sonuç da 1 olmaktadır. 1&#8242;den büyük sayılar için ise sayının faktöriyel değeri sayının kendisi ile bir eksiğinin faktöriyel değerinin çarpımına eşittir.</p>
<p><strong>Scheme dilinde faktöriyel</strong></p>
<p>Programlama mantığı olarak özyineli olan ve dolayısıyla döngülerin tamamının yerine özyineli fonksiyon yazıldığı Lisp dilinde ve bu dilin bir türevi olan Scheme dilinde ise aşağıdaki şekilde kodlanabilir:</p>
<p>(define factorial</p>
<pre>   (lambda (n)</pre>
<pre>      (if (= n 1) 1</pre>
<pre>         (* n (factorial (- n 1))))))</pre>
<p>Yukarıdaki kodda factorial isminde bir fonksiyon tanımlanmış ve bu fonksiyonun tek parametresi olduğu (lambda) ve isminin n olduğu belirtildikten sonra C dilindeki fonksiyonumuza benzer şekilde n değerinin 1 olması durumunda 1 diğer durumlarda  ise n&#8217;in bir eksiği ile n&#8217;in çarpımı döndürülmüştür.</p>
<p><strong>Prolog dilinde faktöriyel </strong></p>
<p>Yapı olarak kaziye mantığı (predicate calculus) kullanan Prolog dilinde faktöriyel aşağıdaki şekilde kodlanabilir:</p>
<pre>factorial(1,1).</pre>
<pre>factorial(N,F) :-</pre>
<pre>   N&gt;0,</pre>
<pre>   N1 is N-1,</pre>
<pre>   factorial(N1,F1),</pre>
<pre>   F is N * F1.</pre>
<p>Yukarıdaki kodda faktöriyel hesaplayan bir fonksiyon için N giriş değeri F ise sonuç değerini tutan değişkenlerdir. Bu fonksiyonda iki kural tanımlanmıştır.</p>
<p>Birinci kuralımız (ilk satır) 1 için sonucun 1olduğudur. Yani N=1 değeri sorgulandığında sonuç 1 bulunur. ikinci kuralımız ise (alttaki fonksiyon) N için F sonucunu verir.</p>
<p>F sonucu ise N&#8217;in 0&#8242;dan büyük olduğu değerler için N1 ismindeki ikinci değişkenin değeridir. Bu ikinci değişken ise N1&#8242;in yani N-1&#8242;in değerinin faktöriyel değeridir. Yani şimdiye kadar yazdığımız n* (n-1) mantığıdır.</p>

<p class="sayac_bilgi">395 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/04/27/1863/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Devamsal Geçiş Tarzı (Continuation-passing style, CPS)</title>
		<link>http://www.bilgisayarkavramlari.com/2008/08/13/devamsal-gecis-tarzi-continuation-passing-style-cps/</link>
		<comments>http://www.bilgisayarkavramlari.com/2008/08/13/devamsal-gecis-tarzi-continuation-passing-style-cps/#comments</comments>
		<pubDate>Wed, 13 Aug 2008 00:43:13 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[algoritma analizi (teory of algorithms)]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[Scheme (lisp)]]></category>

		<guid isPermaLink="false">http://shedai.net/bilgisayar/?p=510</guid>
		<description><![CDATA[Yazan: Şadi Evren ŞEKER Fonksiyonel programlamada kullanılan fonksiyon tarzlarından birisidir. Buna göre bu tarzda yazılmış olan bir fonksiyon doğrudan değer döndürmek yerine, ilave bir parametre ile fonksiyondaki hesaplamaları taşır. Devamsal geçiş tarzında yazılan bir fonksiyon çağrıldığı zaman ilave olarak bir prosedür verilerek bu fonksiyonun dönüş değerine yazılır. Doğrudan çağırmada dahili olark yapılan bazı işlemler devamsal [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan: Şadi Evren ŞEKER</p>
<p><a href="http://bilgisayarkavramlari.com/2007/12/18/fonksiyonel-programlama-procedural-programming-functional-programming/">Fonksiyonel programlama</a>da kullanılan fonksiyon tarzlarından birisidir. Buna göre bu tarzda yazılmış olan bir fonksiyon doğrudan değer döndürmek yerine, ilave bir parametre ile fonksiyondaki hesaplamaları taşır.</p>
<p>Devamsal geçiş tarzında yazılan bir fonksiyon çağrıldığı zaman ilave olarak bir prosedür verilerek bu fonksiyonun dönüş değerine yazılır. Doğrudan çağırmada dahili olark yapılan bazı işlemler devamsal geçiş tarzında harici olarak yapılmaktadır. Örneğin fonksiyonların dönüşleri, ara değerleri, parametrelerin çalıştırılma dereceleri ve kuyruk <a href="http://bilgisayarkavramlari.com/2008/08/12/kuyruk-ozyinelemesi-tail-recursion-birikimsel-tarz-accumulation-style/">özyinelemeler (tail recursion)</a> gibi.</p>
<p>Doğrudan çağırmalı bir fonksiyonun devamsal geçiş tarzına çevrilmesi otomatik olarak yapılabilmektedir. Bu sayede <a href="http://bilgisayarkavramlari.com/2008/01/03/derleyici-compiler/">derleyiciler (compilers)</a> bu özellikten faydalanarak iyileştirme (optimisation) yapabilmektedirler. İşin aslında bu özelliğinden dolayı devamsal geçiş tarzı programcılardan çok derleyiciler tarafından kullanılan bir tarzdır.</p>
<p>Scheme dilinde bazı örnek çevrimler aşağıda verilmiştir:</p>
<table border="0">
<tbody>
<tr>
<td>
<div style="text-align: left;" dir="ltr">
<table border="0">
<tbody>
<tr>
<th>Doğrudan Tarz</th>
</tr>
</tbody>
</table>
<pre class="source-scheme"><span class="br0">(</span><span class="kw1">define</span> <span class="br0">(</span>pyth x y<span class="br0">)</span>
 <span class="br0">(</span><span class="kw1">sqrt</span> <span class="br0">(</span>+ <span class="br0">(</span>* x x<span class="br0">)</span> <span class="br0">(</span>* y y<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)
</span></pre>
<table border="0">
<tbody>
<tr>
<td>
<div style="text-align: left;" dir="ltr">
<table border="0">
<tbody>
<tr>
<th> Devamsal Geçiş Tarzı</th>
</tr>
</tbody>
</table>
<pre class="source-scheme"><span class="br0">(</span><span class="kw1">define</span> <span class="br0">(</span>pyth x y k<span class="br0">)</span>
 <span class="br0">(</span>* x x <span class="br0">(</span><span class="kw1">lambda</span> <span class="br0">(</span>x2<span class="br0">)</span>
         <span class="br0">(</span>* y y <span class="br0">(</span><span class="kw1">lambda</span> <span class="br0">(</span>y2<span class="br0">)</span>
                 <span class="br0">(</span>+ x2 y2 <span class="br0">(</span><span class="kw1">lambda</span> <span class="br0">(</span>x2py2<span class="br0">)</span>
                           <span class="br0">(</span><span class="kw1">sqrt</span> x2py2 k<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span></pre>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</td>
<td></td>
</tr>
<tr>
<td>
<div style="text-align: left;" dir="ltr">
<table border="0">
<tbody>
<tr>
<th>Doğrudan Tarz</th>
</tr>
</tbody>
</table>
<pre class="source-scheme"><span class="br0">(</span><span class="kw1">define</span> <span class="br0">(</span>factorial n<span class="br0">)</span>
 <span class="br0">(</span><span class="kw1">if</span> <span class="br0">(</span>= n <span class="nu0">0</span><span class="br0">)</span>
     <span class="nu0">1</span>
     <span class="br0">(</span>* n <span class="br0">(</span>factorial <span class="br0">(</span>- n <span class="nu0">1</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)
</span></pre>
<table border="0">
<tbody>
<tr>
<td>
<div style="text-align: left;" dir="ltr">
<table border="0">
<tbody>
<tr>
<th> Devamsal Geçiş Tarzı</th>
</tr>
</tbody>
</table>
<pre class="source-scheme"><span class="br0">(</span><span class="kw1">define</span> <span class="br0">(</span>factorial n k<span class="br0">)</span>
  <span class="br0">(</span>= n <span class="nu0">0</span> <span class="br0">(</span><span class="kw1">lambda</span> <span class="br0">(</span>b<span class="br0">)</span>
          <span class="br0">(</span><span class="kw1">if</span> b
             <span class="br0">(</span>k <span class="nu0">1</span><span class="br0">)</span>
             <span class="br0">(</span>- n <span class="nu0">1</span> <span class="br0">(</span><span class="kw1">lambda</span> <span class="br0">(</span>nm1<span class="br0">)</span>
                     <span class="br0">(</span>factorial
                      nm1
                      <span class="br0">(</span><span class="kw1">lambda</span> <span class="br0">(</span>fnm1<span class="br0">)</span>
                       <span class="br0">(</span>* n fnm1 k<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span></pre>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</td>
<td></td>
</tr>
<tr>
<td>
<div style="text-align: left;" dir="ltr">
<table border="0">
<tbody>
<tr>
<th>Doğrudan Tarz</th>
</tr>
</tbody>
</table>
<pre class="source-scheme"><span class="br0">(</span><span class="kw1">define</span> <span class="br0">(</span>factorial n<span class="br0">)</span> <span class="br0">(</span>f-aux n <span class="nu0">1</span><span class="br0">)</span><span class="br0">)</span>
<span class="br0">(</span><span class="kw1">define</span> <span class="br0">(</span>f-aux n a<span class="br0">)</span>
 <span class="br0">(</span><span class="kw1">if</span> <span class="br0">(</span>= n <span class="nu0">0</span><span class="br0">)</span>
     a
     <span class="br0">(</span>f-aux <span class="br0">(</span>- n <span class="nu0">1</span><span class="br0">)</span> <span class="br0">(</span>* n a<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)
</span></pre>
<table border="0">
<tbody>
<tr>
<td>
<div style="text-align: left;" dir="ltr">
<table border="0">
<tbody>
<tr>
<th> Devamsal Geçiş Tarzı</th>
</tr>
</tbody>
</table>
<pre class="source-scheme"><span class="br0">(</span><span class="kw1">define</span> <span class="br0">(</span>factorial n k<span class="br0">)</span>
 <span class="br0">(</span>f-aux n <span class="nu0">1</span> k<span class="br0">)</span><span class="br0">)</span>
<span class="br0">(</span><span class="kw1">define</span> <span class="br0">(</span>f-aux n a k<span class="br0">)</span>
 <span class="br0">(</span>= n <span class="nu0">0</span> <span class="br0">(</span><span class="kw1">lambda</span> <span class="br0">(</span>b<span class="br0">)</span>
         <span class="br0">(</span><span class="kw1">if</span> b
             <span class="br0">(</span>k a<span class="br0">)</span>
             <span class="br0">(</span>- n <span class="nu0">1</span> <span class="br0">(</span><span class="kw1">lambda</span> <span class="br0">(</span>nm1<span class="br0">)</span>
                     <span class="br0">(</span>* n a <span class="br0">(</span><span class="kw1">lambda</span> <span class="br0">(</span>nta<span class="br0">)</span>
                             <span class="br0">(</span>f-aux nm1 nta k<span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span><span class="br0">)</span></pre>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</td>
<td></td>
</tr>
</tbody>
</table>
<p>Yukarıda verilen iki farklı faktöriyel hesabından ilki (yani yukarıdaki 3 fonksiyondan ikincisi) doğrudan çağırmanın çevrilmiş haliyken ikincisi (yani yukarıdaki 3 fonksiyondan sonuncusu) yardımcı bir fonksiyon (f-aux) kullanarak <a href="http://bilgisayarkavramlari.com/2008/08/12/kuyruk-ozyinelemesi-tail-recursion-birikimsel-tarz-accumulation-style/">birikimsel tarzda (accumulation style)</a> yazılmış bir fonksiyonun devamsal geçiş tarzına dönüştürülmesini göstermektedir.</p>
<p>Ayrıca <a href="http://bilgisayarkavramlari.com/2008/08/04/tembel-liste-lazy-list/">tembel programlama (lazy programming) </a>kullanılarak bir fonksiyonun <a href="http://bilgisayarkavramlari.com/2008/08/05/korilemek-currying/">körilenmesi (curry)</a> gerekirse faktöriyel hesabı aşağıdaki şekilde yazılmalıdır:</p>
<pre>(define (factorial n k)
  (if (= n 0)
      (k 1)
      (factorial (- n 1) (compose k (curry * n)))))

&gt;(factorial 5 (lambda (x) x))
&gt;120</pre>
<p>Yukarıda verilen bu fonksiyonun temel farkı k parametresi ile biriktirilen (Accumulate) değerlerin birer fonksiyon olmasıdır. Yani basitçe her çağırmada gelen fonksiyon bir önceki fonksiyon ile birleştirilmiş (compose) ve faktöriyelin başlangıç durumu (initial state) olan n = 0 durumuna gelindiğinde (n = 0 olunca 0! = 1 olduğunu hatırlayalım) bu fonksiyon birleşimlerine 1 parametresi verilerek çağrılmıştır. Bu durum daha basit şekilde aşağıdaki matematiksel gösterimde yer almıştır:</p>
<pre>factorial(factorial(factorial(factorial(factorial(1))))</pre>
<p>yani basitçe factorial fonksiyonları n kadar birleştirilmiştir. n = 0 olunca birleştirme işlemi durmuş bunun yerine bu birleştirilmiş fonksiyonlara 1 parametresi verilmiştir.</p>

<p class="sayac_bilgi">68 views</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2008/08/13/devamsal-gecis-tarzi-continuation-passing-style-cps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

