<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://program.sonsuz.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://program.sonsuz.us/" rel="alternate" type="text/html" /><updated>2026-10-10T18:05:54+00:00</updated><id>https://program.sonsuz.us/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">Akıllı Bir Kelime Öğrenme Sistemi Nasıl Tasarlanır?</title><link href="https://program.sonsuz.us/posts/akilli-bir-kelime-ogrenme-sistemi-nasil-tasarlanir/" rel="alternate" type="text/html" title="Akıllı Bir Kelime Öğrenme Sistemi Nasıl Tasarlanır?" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akilli-bir-kelime-ogrenme-sistemi-nasil-tasarlanir</id><content type="html" xml:base="https://program.sonsuz.us/posts/akilli-bir-kelime-ogrenme-sistemi-nasil-tasarlanir/"><![CDATA[<p>Bir kelimeyi bugün öğrenip yarın unutmak beynimizin küçük bir şakasıdır; kötü hafızadan çok, yanlış zamanda tekrar yapmanın sonucudur. AnkiWeb, Mochi ve Mnemosyne gibi sistemler bu sorunu <strong>aralıklı tekrar</strong> algoritmalarıyla çözer. Gelin benzer bir uygulamanın arkasındaki teoriyi, araçların farklı yaklaşımlarını ve çalışır durumdaki basit bir zamanlama algoritmasını birlikte inceleyelim.</p>

<p><img src="/img/akilli-bir-kelime-63.svg" alt="akilli-bir-kelime-63" /></p>

<p>``</p>

<h2 id="aralıklı-tekrar-neden-işe-yarar">Aralıklı tekrar neden işe yarar?</h2>

<p>Hermann Ebbinghaus’un unutma eğrisi, bir bilginin hatırlanma gücünün zamanla üstel biçimde azaldığını öne sürer. Basitleştirilmiş bir model şöyledir:</p>

\[R(t) = e^{-t/S}\]

<p>Burada $R(t)$ hatırlama olasılığını, $t$ son çalışmadan beri geçen süreyi, $S$ ise anının dayanıklılığını temsil eder. Aynı kelimeyi başarıyla hatırladıkça $S$ büyür; böylece tekrarlar arasındaki süre uzatılabilir.</p>

<p>Örneğin “serendipity” kelimesini ilk gün öğrendiğimizi düşünelim. İlk tekrar bir gün sonra, sonraki tekrar üç gün sonra, ardından sekiz veya on gün sonra yapılabilir. Amaç, kartı tamamen unutmadan hemen önce göstermektir. Çok erken tekrar zaman kaybettirir, çok geç tekrar ise öğrenme sürecini başa sarar.</p>

<h2 id="ankiweb-mochi-ve-mnemosyne-karşılaştırması">AnkiWeb, Mochi ve Mnemosyne karşılaştırması</h2>

<p>Bu araçların ortak hedefi aynı olsa da kullanıcı deneyimleri ve veri modelleri farklıdır:</p>

<table>
  <thead>
    <tr>
      <th>Sistem</th>
      <th>Güçlü yönü</th>
      <th>İçerik yaklaşımı</th>
      <th>Kimler için uygun?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>AnkiWeb</td>
      <td>Geniş eklenti ve deste sistemi</td>
      <td>Ön yüz, arka yüz ve alanlar</td>
      <td>Ayrıntılı kontrol isteyenler</td>
    </tr>
    <tr>
      <td>Mochi</td>
      <td>Temiz arayüz ve Markdown desteği</td>
      <td>Notlar arasında bağlantılar</td>
      <td>Not alma ile ezberi birleştirenler</td>
    </tr>
    <tr>
      <td>Mnemosyne</td>
      <td>Araştırma odaklı sade yapı</td>
      <td>Klasik soru-cevap kartları</td>
      <td>Dikkat dağıtmayan araç arayanlar</td>
    </tr>
  </tbody>
</table>

<p>Anki ekosistem ve özelleştirme konusunda öne çıkar. Mochi, kartları birbirine bağlayarak kişisel bilgi ağı kurmayı kolaylaştırır. Mnemosyne ise daha sade ve akademik bir yaklaşım sunar. Kısacası Anki bir kontrol paneli, Mochi dijital bahçe, Mnemosyne ise sakin bir çalışma masası gibidir.</p>

<h2 id="temel-veri-modeli">Temel veri modeli</h2>

<p>Kendi sistemimizde her kart için kelime, anlam, örnek cümle, tekrar tarihi, kolaylık katsayısı ve tekrar sayısı saklanabilir. Ayrıca öğrenme yönünü değiştirmek yararlıdır: “apple → elma” kartı tanımayı, “elma → apple” kartı ise aktif hatırlamayı ölçer.</p>

<p>Basit bir kart modeli şu alanları içerebilir:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">front</code>: Sorulan kelime veya ipucu</li>
  <li><code class="language-plaintext highlighter-rouge">back</code>: Anlam ve örnek cümle</li>
  <li><code class="language-plaintext highlighter-rouge">interval</code>: Bir sonraki tekrara kalan gün</li>
  <li><code class="language-plaintext highlighter-rouge">ease</code>: Kartın kişisel zorluk katsayısı</li>
  <li><code class="language-plaintext highlighter-rouge">due</code>: Gösterileceği tarih</li>
</ul>

<h2 id="basitleştirilmiş-sm-2-zamanlayıcısı">Basitleştirilmiş SM-2 zamanlayıcısı</h2>

<p>Aşağıdaki Python fonksiyonu, kullanıcının 0 ile 5 arasındaki cevabına göre yeni tekrar aralığını hesaplar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">schedule_card</span><span class="p">(</span><span class="n">quality</span><span class="p">,</span> <span class="n">repetitions</span><span class="p">,</span> <span class="n">interval</span><span class="p">,</span> <span class="n">ease</span><span class="p">):</span>
    <span class="c1"># 3'ten düşük puan, kartın hatırlanamadığını gösterir.
</span>    <span class="k">if</span> <span class="n">quality</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">:</span>
        <span class="n">repetitions</span> <span class="o">=</span> <span class="mi">0</span>
        <span class="n">interval</span> <span class="o">=</span> <span class="mi">1</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">repetitions</span> <span class="o">+=</span> <span class="mi">1</span>

        <span class="k">if</span> <span class="n">repetitions</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
            <span class="n">interval</span> <span class="o">=</span> <span class="mi">1</span>
        <span class="k">elif</span> <span class="n">repetitions</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
            <span class="n">interval</span> <span class="o">=</span> <span class="mi">6</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="n">interval</span> <span class="o">=</span> <span class="nf">round</span><span class="p">(</span><span class="n">interval</span> <span class="o">*</span> <span class="n">ease</span><span class="p">)</span>

    <span class="c1"># Başarılı cevap kolaylığı artırır, zor cevap azaltır.
</span>    <span class="n">ease</span> <span class="o">+=</span> <span class="mf">0.1</span> <span class="o">-</span> <span class="p">(</span><span class="mi">5</span> <span class="o">-</span> <span class="n">quality</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="mf">0.08</span> <span class="o">+</span> <span class="p">(</span><span class="mi">5</span> <span class="o">-</span> <span class="n">quality</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.02</span><span class="p">)</span>
    <span class="n">ease</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="mf">1.3</span><span class="p">,</span> <span class="n">ease</span><span class="p">)</span>

    <span class="k">return</span> <span class="n">repetitions</span><span class="p">,</span> <span class="n">interval</span><span class="p">,</span> <span class="n">ease</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">schedule_card</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mf">2.5</span><span class="p">))</span>
</code></pre></div></div>

<p>Fonksiyon kart unutulduğunda programı sıfırlar; doğru cevaplarda ise mevcut aralığı kolaylık katsayısıyla büyütür. $I_{yeni} = I_{eski} \times E$ ilişkisi, uzun vadede tekrar sayısını ciddi biçimde azaltır. Gerçek bir uygulamada saat dilimi, günlük kart sınırı, gecikmiş tekrarlar ve kullanıcı alışkanlıkları da hesaba katılmalıdır.</p>

<h2 id="i̇yi-bir-sistemin-sırrı">İyi bir sistemin sırrı</h2>

<p>Algoritma tek başına mucize yaratmaz. Kartlar kısa olmalı, tek bir bilgiyi sınamalı ve kelimeyi bağlam içinde göstermelidir. Görsel, ses kaydı ve gerçek bir örnek cümle hatırlamayı güçlendirir. En iyi araç; en gelişmiş formüle sahip olan değil, her gün açmayı unutmadığınız araçtır. Beş dakikalık düzenli tekrar, pazar gecesi yapılan iki saatlik kelime maratonunu çoğu zaman rahatça yener.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="kelime öğrenme" /><category term="aralıklı tekrar" /><category term="anki" /><category term="mochi" /><category term="mnemosyne" /><category term="python" /><summary type="html"><![CDATA[Bir kelimeyi bugün öğrenip yarın unutmak beynimizin küçük bir şakasıdır; kötü hafızadan çok, yanlış zamanda tekrar yapmanın sonucudur. AnkiWeb, Mochi ve Mnemosyne gibi sistemler bu sorunu aralıklı tekrar algoritmalarıyla çözer. Gelin benzer bir uygulamanın arkasındaki teoriyi, araçların farklı yaklaşımlarını ve çalışır durumdaki basit bir zamanlama algoritmasını birlikte inceleyelim.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akilli-bir-kelime-63.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akilli-bir-kelime-63.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Bulmacaların Gizli Anahtarı: Problem Çözümünde İkili Sayı Sistemi</title><link href="https://program.sonsuz.us/posts/bulmacalarin-gizli-anahtari-problem-cozumunde-ikili-sayi-sistemi/" rel="alternate" type="text/html" title="Bulmacaların Gizli Anahtarı: Problem Çözümünde İkili Sayı Sistemi" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/bulmacalarin-gizli-anahtari-problem-cozumunde-ikili-sayi-sistemi</id><content type="html" xml:base="https://program.sonsuz.us/posts/bulmacalarin-gizli-anahtari-problem-cozumunde-ikili-sayi-sistemi/"><![CDATA[<p><img src="/img/bulmacalarin-gizli-anahtari-13.svg" alt="bulmacalarin-gizli-anahtari-13" /></p>

<p>Bilgisayarların yalnızca sıfır ve birlerle çalışması ilk bakışta teknolojik bir sınırlama gibi görünebilir. Oysa ikili sayı sistemi, klasik mantık bulmacalarında bilgiyi düzenlemek, olasılıkları kodlamak ve en az sayıda işlemle sonuca ulaşmak için kullanılan son derece güçlü bir araçtır. Zehirli şişelerden ağırlık tartma sorularına kadar pek çok problem, doğru açıdan bakıldığında aslında gizlenmiş birer ikili kodlama egzersizidir.</p>

<p>``</p>

<h2 id="i̇kili-sistem-neden-bu-kadar-kullanışlı">İkili sistem neden bu kadar kullanışlı?</h2>

<p>Onluk sistemde her basamak 0 ile 9 arasında değer alırken ikili sistemde yalnızca iki durum bulunur: <strong>0</strong> ve <strong>1</strong>. Bunlar hayır–evet, kapalı–açık, başarısız–başarılı veya hafif–ağır gibi iki seçenekli durumları temsil edebilir.</p>

<p>Bir ikili sayının değeri şöyle hesaplanır:</p>

\[N = b_0 2^0 + b_1 2^1 + b_2 2^2 + ... + b_k 2^k\]

<p>Burada her $b_i$ yalnızca 0 veya 1 olabilir. Örneğin $1011_2$ sayısı:</p>

\[1 × 2^3 + 0 × 2^2 + 1 × 2^1 + 1 × 2^0 = 11\]

<p>Bu gösterimin problem çözmedeki asıl avantajı, $k$ adet iki durumlu gözlemle $2^k$ farklı olasılığı ayırt edebilmesidir.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: right">Gözlem sayısı</th>
      <th style="text-align: right">Kodlanabilen olasılık</th>
      <th>Örnek kodlar</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: right">1</td>
      <td style="text-align: right">$2^1 = 2$</td>
      <td>0, 1</td>
    </tr>
    <tr>
      <td style="text-align: right">2</td>
      <td style="text-align: right">$2^2 = 4$</td>
      <td>00, 01, 10, 11</td>
    </tr>
    <tr>
      <td style="text-align: right">3</td>
      <td style="text-align: right">$2^3 = 8$</td>
      <td>000–111</td>
    </tr>
    <tr>
      <td style="text-align: right">10</td>
      <td style="text-align: right">$2^{10} = 1024$</td>
      <td>0000000000–1111111111</td>
    </tr>
  </tbody>
</table>

<h2 id="zehirli-şişe-bulmacası">Zehirli şişe bulmacası</h2>

<p>Klasik soruyu düşünelim: <strong>1000 şişeden biri zehirli ve yalnızca 10 test şeridimiz var. Tek turda zehirli şişeyi nasıl buluruz?</strong> Her şişeyi ayrı ayrı test etmek mümkün değildir. Fakat $2^{10}=1024$ olduğu için 10 şerit, 1024 farklı sonucu kodlayabilir.</p>

<p>Şişeleri 0 ile 999 arasında numaralandırır ve numaraları 10 bitlik ikili biçimde yazarız. Bir şişenin ikili gösterimindeki hangi bitler 1 ise o şişeden ilgili test şeritlerine örnek damlatırız. Örneğin 13 numaralı şişenin kodu <code class="language-plaintext highlighter-rouge">0000001101</code> olur; dolayısıyla 1 değerine sahip bitlerin karşılık geldiği şeritlere eklenir.</p>

<p>Bekleme sonunda pozitif çıkan şeritler 1, negatif çıkanlar 0 kabul edilir. Ortaya çıkan ikili sayı doğrudan zehirli şişenin numarasıdır. Buradaki sihir aslında sihir değil, her şişeye benzersiz bir <strong>bit deseni</strong> vermektir.</p>

<h2 id="ağırlıklarla-ölçme-bulmacası">Ağırlıklarla ölçme bulmacası</h2>

<p>Elimizde 1, 2, 4 ve 8 kilogramlık ağırlıklar varsa 1 ile 15 kilogram arasındaki her tam değeri ölçebiliriz. Çünkü bu ağırlıklar ikinin kuvvetleridir:</p>

\[1 + 2 + 4 + 8 = 15\]

<p>Örneğin 13 kilogram, $1101_2$ biçimindedir. Bu nedenle 8, 4 ve 1 kilogramlık ağırlıklar kullanılır; 2 kilogramlık ağırlık kullanılmaz.</p>

<table>
  <thead>
    <tr>
      <th>İkili basamak</th>
      <th style="text-align: right">Ağırlık</th>
      <th>13 kg için durum</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$2^3$</td>
      <td style="text-align: right">8 kg</td>
      <td>Kullan</td>
    </tr>
    <tr>
      <td>$2^2$</td>
      <td style="text-align: right">4 kg</td>
      <td>Kullan</td>
    </tr>
    <tr>
      <td>$2^1$</td>
      <td style="text-align: right">2 kg</td>
      <td>Kullanma</td>
    </tr>
    <tr>
      <td>$2^0$</td>
      <td style="text-align: right">1 kg</td>
      <td>Kullan</td>
    </tr>
  </tbody>
</table>

<h2 id="aynı-fikri-python-ile-görmek">Aynı fikri Python ile görmek</h2>

<p>Aşağıdaki kod, bir sayıyı oluşturmak için hangi ikinin kuvvetlerinin seçilmesi gerektiğini bulur:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">secilen_agirliklar</span><span class="p">(</span><span class="n">hedef</span><span class="p">):</span>
    <span class="n">agirliklar</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="n">bit</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="k">while</span> <span class="n">hedef</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">hedef</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">:</span>
            <span class="n">agirliklar</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="mi">2</span> <span class="o">**</span> <span class="n">bit</span><span class="p">)</span>
        <span class="n">hedef</span> <span class="o">&gt;&gt;=</span> <span class="mi">1</span>
        <span class="n">bit</span> <span class="o">+=</span> <span class="mi">1</span>

    <span class="k">return</span> <span class="n">agirliklar</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">secilen_agirliklar</span><span class="p">(</span><span class="mi">13</span><span class="p">))</span>  <span class="c1"># [1, 4, 8]
</span></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">hedef &amp; 1</code> işlemi en sağdaki bitin 1 olup olmadığını denetler. <code class="language-plaintext highlighter-rouge">hedef &gt;&gt;= 1</code> ise sayıyı bir bit sağa kaydırarak sıradaki basamağa geçer. Böylece algoritma, sayının ikili gösterimini doğrudan seçilecek ağırlıklara dönüştürür.</p>

<h2 id="bulmacalarda-ikili-düşünme-yöntemi">Bulmacalarda ikili düşünme yöntemi</h2>

<p>Bir soruda çok sayıda aday ve yalnızca iki sonuç üreten testler varsa şu adımlar uygulanabilir:</p>

<ol>
  <li>Olasılık sayısını $n$ olarak belirle.</li>
  <li>$2^k ≥ n$ koşulunu sağlayan en küçük $k$ değerini bul.</li>
  <li>Her adaya benzersiz bir $k$ bitlik kod ata.</li>
  <li>Her testi kodun bir basamağıyla ilişkilendir.</li>
  <li>Sonuç bitlerini birleştirerek doğru adayı belirle.</li>
</ol>

<p>Kısacası ikili sistem yalnızca bilgisayarların dili değildir; sınırlı gözlemlerden maksimum bilgi çıkarma yöntemidir. Bir bulmacada “açık veya kapalı”, “doğru veya yanlış” gibi iki durumlu sonuçlar görüyorsanız, çözümün bir köşesinde büyük olasılıkla ikinin kuvvetleri gülümsüyordur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="ikili sistem" /><category term="algoritma" /><category term="problem çözme" /><category term="matematik" /><category term="bulmaca" /><category term="python" /><summary type="html"><![CDATA[Bilgisayarların yalnızca sıfır ve birlerle çalışması ilk bakışta teknolojik bir sınırlama gibi görünebilir. Oysa ikili sayı sistemi, klasik mantık bulmacalarında bilgiyi düzenlemek, olasılıkları kodlamak ve en az sayıda işlemle sonuca ulaşmak için kullanılan son derece güçlü bir araçtır. Zehirli şişelerden ağırlık tartma sorularına kadar pek çok problem, doğru açıdan bakıldığında aslında gizlenmiş birer ikili kodlama egzersizidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/bulmacalarin-gizli-anahtari-13.png" /><media:content medium="image" url="https://program.sonsuz.us/img/bulmacalarin-gizli-anahtari-13.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Büyük O, Teta ve Omega: Algoritma Karmaşıklığının Üç Farklı Yüzü</title><link href="https://program.sonsuz.us/posts/buyuk-o-teta-ve-omega-algoritma-karmasikliginin-uc-farkli-yuzu/" rel="alternate" type="text/html" title="Büyük O, Teta ve Omega: Algoritma Karmaşıklığının Üç Farklı Yüzü" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/buyuk-o-teta-ve-omega-algoritma-karmasikliginin-uc-farkli-yuzu</id><content type="html" xml:base="https://program.sonsuz.us/posts/buyuk-o-teta-ve-omega-algoritma-karmasikliginin-uc-farkli-yuzu/"><![CDATA[<p>Bir algoritmanın hızlı olduğunu söylemek tek başına pek anlamlı değildir. Hangi girdide, ne kadar hızlı ve büyüyen veri karşısında nasıl davranıyor? İşte Büyük O, Teta ve Omega notasyonları bu soruları matematiksel sınırlarla yanıtlar. Ancak yaygın inanışın aksine Büyük O doğrudan “en kötü”, Omega “en iyi”, Teta da “ortalama” durum demek değildir. Durum analizi ile asimptotik sınır, birbiriyle ilişkili ama farklı kavramlardır.</p>

<p>``</p>

<h2 id="önce-asimptotik-analiz-nedir">Önce asimptotik analiz nedir?</h2>

<p>Asimptotik analiz, girdi boyutu $n$ büyürken algoritmanın zaman veya bellek ihtiyacının nasıl değiştiğini inceler. Donanım, programlama dili ve birkaç milisaniyelik sabit farklar yerine büyüme eğilimine odaklanır.</p>

<p>Örneğin çalışma süresi</p>

\[T(n)=3n^2+5n+20\]

<p>olan bir algoritmada, büyük $n$ değerleri için $n^2$ terimi baskındır. Sabit katsayılar ve düşük dereceli terimler göz ardı edildiğinde büyüme $n^2$ ile ifade edilir.</p>

<h2 id="üç-notasyonun-temel-farkı">Üç notasyonun temel farkı</h2>

<table>
  <thead>
    <tr>
      <th>Notasyon</th>
      <th>Anlamı</th>
      <th>Verdiği sınır</th>
      <th>Basit yorum</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$O(g(n))$</td>
      <td>En fazla bu hızda büyür</td>
      <td>Üst sınır</td>
      <td>“Bundan daha kötü büyümez.”</td>
    </tr>
    <tr>
      <td>$\Omega(g(n))$</td>
      <td>En az bu hızda büyür</td>
      <td>Alt sınır</td>
      <td>“En az bunun kadar büyür.”</td>
    </tr>
    <tr>
      <td>$\Theta(g(n))$</td>
      <td>Aynı mertebede büyür</td>
      <td>Sıkı sınır</td>
      <td>“Büyüme hızı tam olarak budur.”</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/buyuk-o-teta-62.svg" alt="buyuk-o-teta-62" /></p>

<h3 id="büyük-o-üst-sınır">Büyük O: Üst sınır</h3>

<p>$f(n)=O(g(n))$ diyebilmek için yeterince büyük $n$ değerlerinde</p>

\[0 \leq f(n) \leq c\,g(n)\]

<p>olacak pozitif bir $c$ sabiti bulunmalıdır. Örneğin $3n^2+5n+20$, hem $O(n^2)$ hem de teknik olarak $O(n^3)$ içindedir. Fakat $O(n^2)$ daha bilgilendirici ve daha sıkı bir üst sınırdır.</p>

<h3 id="omega-alt-sınır">Omega: Alt sınır</h3>

<p>$f(n)=\Omega(g(n))$, fonksiyonun en az $g(n)$ kadar hızlı büyüdüğünü belirtir:</p>

\[0 \leq c\,g(n) \leq f(n)\]

<p>Örneğin $3n^2+5n+20$, $\Omega(n^2)$ sınıfındadır. Bu notasyon algoritmanın belirli bir maliyetin altına inemeyeceğini anlatır.</p>

<h3 id="teta-sıkı-sınır">Teta: Sıkı sınır</h3>

<p>Teta, alt ve üst sınırın birleşimidir:</p>

\[c_1g(n) \leq f(n) \leq c_2g(n)\]

<p>Dolayısıyla $f(n)=\Theta(g(n))$ ise fonksiyon hem $O(g(n))$ hem de $\Omega(g(n))$ olur. Örneğimiz için en açıklayıcı ifade $T(n)=\Theta(n^2)$ biçimindedir.</p>

<h2 id="en-iyi-ortalama-ve-en-kötü-durum">En iyi, ortalama ve en kötü durum</h2>

<p>Durumlar, girdinin algoritmayı nasıl etkilediğini; notasyonlar ise seçilen durumdaki büyümeye ilişkin sınırı belirtir.</p>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th>Doğrusal aramadaki örnek</th>
      <th>Karmaşıklık</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>En iyi</td>
      <td>Aranan değer ilk elemandır</td>
      <td>$\Theta(1)$</td>
    </tr>
    <tr>
      <td>Ortalama</td>
      <td>Değer genellikle listenin ortalarındadır</td>
      <td>$\Theta(n)$</td>
    </tr>
    <tr>
      <td>En kötü</td>
      <td>Değer sondadır veya hiç yoktur</td>
      <td>$\Theta(n)$</td>
    </tr>
  </tbody>
</table>

<p>Burada her durum için Teta kullanabildiğimize dikkat edin. “En kötü durum $O(n)$” doğrudur; fakat sıkı sınır biliniyorsa “en kötü durum $\Theta(n)$” daha güçlü bir ifadedir. Ortalama durum analizi ise girdilerin olasılık dağılımını gerektirir. Her girdinin eşit olasılıklı olduğunu varsaymak her zaman gerçekçi değildir.</p>

<h2 id="kod-üzerinde-görelim">Kod üzerinde görelim</h2>

<p>Aşağıdaki Python fonksiyonu, doğrusal arama yaparken kaç karşılaştırma gerçekleştirildiğini de döndürür:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">linear_search</span><span class="p">(</span><span class="n">values</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
    <span class="n">comparisons</span> <span class="o">=</span> <span class="mi">0</span>

    <span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">values</span><span class="p">):</span>
        <span class="n">comparisons</span> <span class="o">+=</span> <span class="mi">1</span>
        <span class="k">if</span> <span class="n">value</span> <span class="o">==</span> <span class="n">target</span><span class="p">:</span>
            <span class="k">return</span> <span class="n">index</span><span class="p">,</span> <span class="n">comparisons</span>

    <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">comparisons</span>

<span class="n">numbers</span> <span class="o">=</span> <span class="p">[</span><span class="mi">8</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">21</span><span class="p">]</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">linear_search</span><span class="p">(</span><span class="n">numbers</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span>   <span class="c1"># En iyi durum: 1 karşılaştırma
</span><span class="nf">print</span><span class="p">(</span><span class="nf">linear_search</span><span class="p">(</span><span class="n">numbers</span><span class="p">,</span> <span class="mi">21</span><span class="p">))</span>  <span class="c1"># En kötü durum: 5 karşılaştırma
</span></code></pre></div></div>

<p>İlk çağrıda maliyet girdi boyutundan bağımsızdır. İkinci çağrıda karşılaştırma sayısı $n$ ile birlikte doğrusal büyür.</p>

<h2 id="hangisini-kullanmalıyız">Hangisini kullanmalıyız?</h2>

<p>Bir algoritmayı tanıtırken analiz edilen durumu açıkça söylemek en güvenli yaklaşımdır: “en kötü durumda $\Theta(n^2)$” gibi. Yalnızca güvenli bir üst sınır biliniyorsa Büyük O, kaçınılmaz bir alt sınır gösteriliyorsa Omega, büyüme kesin biçimde sınırlandırılabiliyorsa Teta kullanılmalıdır. Kısacası notasyonlar yarışmıyor; algoritmanın performansını farklı açılardan aydınlatıyor.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="algoritmalar" /><category term="büyük-o" /><category term="karmaşıklık" /><category term="performans" /><category term="veri-yapıları" /><category term="python" /><summary type="html"><![CDATA[Bir algoritmanın hızlı olduğunu söylemek tek başına pek anlamlı değildir. Hangi girdide, ne kadar hızlı ve büyüyen veri karşısında nasıl davranıyor? İşte Büyük O, Teta ve Omega notasyonları bu soruları matematiksel sınırlarla yanıtlar. Ancak yaygın inanışın aksine Büyük O doğrudan “en kötü”, Omega “en iyi”, Teta da “ortalama” durum demek değildir. Durum analizi ile asimptotik sınır, birbiriyle ilişkili ama farklı kavramlardır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/buyuk-o-teta-62.png" /><media:content medium="image" url="https://program.sonsuz.us/img/buyuk-o-teta-62.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Dişli Çarklardan Silikon Çiplere: Bilgisayarın Gelişim Tarihi</title><link href="https://program.sonsuz.us/posts/disli-carklardan-silikon-ciplere-bilgisayarin-gelisim-tarihi/" rel="alternate" type="text/html" title="Dişli Çarklardan Silikon Çiplere: Bilgisayarın Gelişim Tarihi" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/disli-carklardan-silikon-ciplere-bilgisayarin-gelisim-tarihi</id><content type="html" xml:base="https://program.sonsuz.us/posts/disli-carklardan-silikon-ciplere-bilgisayarin-gelisim-tarihi/"><![CDATA[<p>Bugün cebimizde taşıdığımız telefonlar, birkaç on yıl önce odaları dolduran bilgisayarlardan milyonlarca kat daha güçlü. Ancak bu teknolojik yolculuk bir anda başlamadı. Dişli çarklarla çalışan hesap makinelerinden vakum tüplerine, transistörlerden milyarlarca bileşen içeren işlemcilere uzanan bilgisayar tarihi; matematik, mühendislik ve insan merakının ortak ürünüdür.</p>

<p>``</p>

<h2 id="mekanik-hesaplamanın-doğuşu">Mekanik hesaplamanın doğuşu</h2>

<p>Bilgisayarların uzak atalarından biri, 1642 yılında Blaise Pascal tarafından geliştirilen <strong>Pascaline</strong> adlı mekanik hesap makinesiydi. Dişli çarklar kullanan bu cihaz toplama ve çıkarma yapabiliyordu. Gottfried Wilhelm Leibniz ise 1670’lerde sistemi geliştirerek çarpma ve bölme işlemlerini de mekanikleştirdi.</p>

<p>Bu makinelerin temel fikri, sayıları fiziksel konumlarla temsil etmekti. Örneğin bir çarkın on farklı konumu, 0 ile 9 arasındaki rakamlara karşılık geliyordu. Günümüzde aynı yaklaşım elektrik sinyalleriyle uygulanır; ancak on durum yerine çoğunlukla iki durum kullanılır:</p>

\[bit \in \{0,1\}\]

<p>Mekanik sistemlerde hareket eden parçalar bilgiyi taşırken modern bilgisayarlarda bu görevi gerilim seviyeleri üstlenir.</p>

<h2 id="programlanabilir-makine-fikri">Programlanabilir makine fikri</h2>

<p>1800’lerin başında Joseph Marie Jacquard, dokuma tezgâhlarını <strong>delikli kartlarla</strong> kontrol etti. Kartlardaki delikler bir tür komut dizisi oluşturuyordu. Charles Babbage bu fikirden etkilenerek 1837’de <strong>Analitik Makine</strong> tasarımını ortaya koydu.</p>

<p>Babbage’ın makinesi tamamlanamamış olsa da işlem birimi, bellek, giriş ve çıkış gibi modern bilgisayar bileşenlerini teorik olarak içeriyordu. Ada Lovelace ise makinenin Bernoulli sayılarını hesaplaması için bir algoritma hazırladı ve tarihin ilk bilgisayar programcısı kabul edildi.</p>

<h2 id="elektronik-bilgisayarlar-sahneye-çıkıyor">Elektronik bilgisayarlar sahneye çıkıyor</h2>

<p>1940’larda mekanik parçaların yerini röleler ve vakum tüpleri aldı. 1946’da tanıtılan <strong>ENIAC</strong>, yaklaşık 18.000 vakum tüpü kullanıyor ve saniyede binlerce işlem gerçekleştirebiliyordu. Ne var ki devasa boyutlu, enerji oburu ve arızaya yatkındı.</p>

<table>
  <thead>
    <tr>
      <th>Dönem</th>
      <th>Temel teknoloji</th>
      <th>Başlıca avantaj</th>
      <th>Başlıca sorun</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1600–1800</td>
      <td>Dişli çarklar</td>
      <td>Hesabı otomatikleştirme</td>
      <td>Yavaşlık ve aşınma</td>
    </tr>
    <tr>
      <td>1940’lar</td>
      <td>Vakum tüpleri</td>
      <td>Elektronik hız</td>
      <td>Isınma ve yüksek enerji</td>
    </tr>
    <tr>
      <td>1950–1960</td>
      <td>Transistörler</td>
      <td>Küçük boyut, güvenilirlik</td>
      <td>Üretim maliyeti</td>
    </tr>
    <tr>
      <td>1970 sonrası</td>
      <td>Mikroişlemciler</td>
      <td>Yüksek entegrasyon</td>
      <td>Isı ve karmaşıklık</td>
    </tr>
    <tr>
      <td>Günümüz</td>
      <td>Çok çekirdekli çipler</td>
      <td>Paralel işlem</td>
      <td>Güç tüketimi sınırları</td>
    </tr>
  </tbody>
</table>

<h2 id="transistör-ve-mikroişlemci-devrimi">Transistör ve mikroişlemci devrimi</h2>

<p>1947’de transistörün geliştirilmesi bilgisayarları küçülttü, hızlandırdı ve daha güvenilir hâle getirdi. Ardından çok sayıda transistörün aynı yüzeye yerleştirildiği <strong>entegre devreler</strong> ortaya çıktı. 1971’de Intel 4004, ticari açıdan başarılı ilk mikroişlemcilerden biri oldu.</p>

<p>İşlemci performansı kabaca saat frekansı, çekirdek sayısı ve saat başına tamamlanan komut miktarıyla ilişkilendirilebilir:</p>

\[P \approx f \times C \times IPC\]

<p>Burada $f$ frekansı, $C$ çekirdek sayısını, $IPC$ ise döngü başına işlenen komut sayısını temsil eder. Gerçek performans bellek, önbellek ve yazılım tasarımından da etkilenir.</p>

<p>İkili sistemin temel mantığını küçük bir Python örneğiyle görebiliriz:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">ikili_topla</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
    <span class="c1"># Metin biçimindeki ikili sayıları onlu sisteme çevirir.
</span>    <span class="n">toplam</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="nf">int</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>

    <span class="c1"># Sonucu yeniden ikili gösterime dönüştürür.
</span>    <span class="k">return</span> <span class="nf">bin</span><span class="p">(</span><span class="n">toplam</span><span class="p">)[</span><span class="mi">2</span><span class="p">:]</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">ikili_topla</span><span class="p">(</span><span class="sh">"</span><span class="s">1010</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">0111</span><span class="sh">"</span><span class="p">))</span>  <span class="c1"># 10001
</span></code></pre></div></div>

<p>Bu kod, işlemcideki gerçek mantık kapılarının yaptığı işi soyut düzeyde taklit eder. Donanımda toplama; AND, OR ve XOR gibi devrelerle gerçekleştirilir.</p>

<h2 id="günümüz-paralellik-ve-uzmanlaşma">Günümüz: Paralellik ve uzmanlaşma</h2>

<p>Transistör sayısının yaklaşık iki yılda bir artacağını öngören <strong>Moore Yasası</strong>, onlarca yıl boyunca sektöre yön verdi. Fiziksel küçülmenin zorlaşmasıyla üreticiler yalnızca frekansı artırmak yerine çok çekirdekli mimarilere yöneldi. GPU’lar grafik işlemlerinin yanında yapay zekâ ve bilimsel hesaplama için kullanılmaya başlandı. NPU gibi özel birimler ise belirli görevleri daha az enerjiyle tamamlıyor.</p>

<p>Kısacası bilgisayarın gelişimi, “daha hızlı hesaplama” arzusundan “doğru işi doğru donanımla yapma” anlayışına evrildi. Pascal’ın çarklarından modern işlemcilerin nanometre ölçeğindeki transistörlerine kadar değişmeyen temel amaç ise aynı kaldı: bilgiyi temsil etmek, kurallara göre işlemek ve anlamlı sonuç üretmek.</p>

<p><img src="/img/disli-carklardan-silikon-55.svg" alt="disli-carklardan-silikon-55" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="bilgisayar tarihi" /><category term="işlemci" /><category term="teknoloji" /><category term="programlama" /><category term="donanım" /><category term="yapay zeka" /><summary type="html"><![CDATA[Bugün cebimizde taşıdığımız telefonlar, birkaç on yıl önce odaları dolduran bilgisayarlardan milyonlarca kat daha güçlü. Ancak bu teknolojik yolculuk bir anda başlamadı. Dişli çarklarla çalışan hesap makinelerinden vakum tüplerine, transistörlerden milyarlarca bileşen içeren işlemcilere uzanan bilgisayar tarihi; matematik, mühendislik ve insan merakının ortak ürünüdür.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/disli-carklardan-silikon-55.png" /><media:content medium="image" url="https://program.sonsuz.us/img/disli-carklardan-silikon-55.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Flashcard Arenasında Üç Rakip: Anki, Mnemosyne ve Mochi</title><link href="https://program.sonsuz.us/posts/flashcard-arenasinda-uc-rakip-anki-mnemosyne-ve-mochi/" rel="alternate" type="text/html" title="Flashcard Arenasında Üç Rakip: Anki, Mnemosyne ve Mochi" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/flashcard-arenasinda-uc-rakip-anki-mnemosyne-ve-mochi</id><content type="html" xml:base="https://program.sonsuz.us/posts/flashcard-arenasinda-uc-rakip-anki-mnemosyne-ve-mochi/"><![CDATA[<p>Bir bilgiyi öğrenmek kolay, onu üç ay sonra hatırlamak ise bambaşka bir oyundur. Flashcard uygulamaları bu oyunda beynimize küçük ama düzenli paslar atar. Anki, Mnemosyne ve Mochi aynı temel fikri, yani <strong>aralıklı tekrarı</strong>, farklı arayüzler ve çalışma modelleriyle uygular. Gelin bu üç aracı karşılaştıralım ve kartların neden doğru zamanda karşımıza çıktığını anlayalım.</p>

<p><img src="/img/flashcard-arenasinda-uc-93.svg" alt="flashcard-arenasinda-uc-93" /></p>

<p>``</p>

<h2 id="aralıklı-tekrar-neden-işe-yarar">Aralıklı tekrar neden işe yarar?</h2>

<p>İnsan belleği, kullanılmayan bilgiyi zamanla silikleştirir. Basitleştirilmiş bir unutma eğrisi şu şekilde gösterilebilir:</p>

\[R(t)=e^{-t/S}\]

<p>Burada $R(t)$ bilgiyi hatırlama olasılığı, $t$ son tekrardan beri geçen süre, $S$ ise belleğin dayanıklılığıdır. Bir kartı başarıyla hatırladığımızda $S$ büyür; böylece bir sonraki tekrar daha ileri bir tarihe taşınabilir.</p>

<p>Basit bir planlayıcı, yeni aralığı yaklaşık olarak şöyle hesaplayabilir:</p>

\[I_{yeni}=I_{eski}\times E\times P\]

<p>$I$ tekrar aralığını, $E$ kartın kolaylık katsayısını, $P$ ise kullanıcının verdiği performans puanını temsil eder. Gerçek uygulamalar başarısızlıkları, gecikmiş tekrarları ve öğrenme geçmişini hesaba katan daha gelişmiş modeller kullanır. Dolayısıyla amaç her kartı her gün göstermek değil, <strong>unutmaya yaklaşırken</strong> göstermektir.</p>

<h2 id="üç-uygulama-üç-farklı-karakter">Üç uygulama, üç farklı karakter</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Anki</th>
      <th>Mnemosyne</th>
      <th>Mochi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Temel yaklaşım</td>
      <td>Güçlü planlama ve özelleştirme</td>
      <td>Sade, akademik odaklı tekrar</td>
      <td>Notlar ile kartları birleştirme</td>
    </tr>
    <tr>
      <td>Kullanım hissi</td>
      <td>Ayrıntılı fakat öğrenme eğrisi yüksek</td>
      <td>Geleneksel ve doğrudan</td>
      <td>Modern ve görsel</td>
    </tr>
    <tr>
      <td>Kart yapısı</td>
      <td>Şablonlar, alanlar ve eklentiler</td>
      <td>Soru-cevap merkezli kartlar</td>
      <td>Markdown tabanlı bağlantılı notlar</td>
    </tr>
    <tr>
      <td>Uygun kullanıcı</td>
      <td>Kontrolü seven yoğun öğrenci</td>
      <td>Dikkat dağıtmayan araç arayan kişi</td>
      <td>Not ağı kurmak isteyen kullanıcı</td>
    </tr>
    <tr>
      <td>Öne çıkan yön</td>
      <td>Geniş ekosistem ve gelişmiş zamanlama</td>
      <td>Açık kaynaklı, yalın deneyim</td>
      <td>Kartlar arasında bağlantı kurabilme</td>
    </tr>
  </tbody>
</table>

<h3 id="anki-ayar-panelini-sevenlerin-laboratuvarı">Anki: Ayar panelini sevenlerin laboratuvarı</h3>

<p>Anki; kart şablonları, etiketler, medya desteği ve eklentileriyle oldukça esnektir. Modern sürümlerde FSRS gibi, geçmiş tekrar verilerinden yararlanarak daha verimli aralıklar üretmeyi amaçlayan zamanlama seçenekleri bulunur. Buna karşılık ilk deste hazırlamak, alanlarla şablonların farkını anlamak ve ayarları düzenlemek başlangıçta yorucu olabilir.</p>

<p>Dil öğrenenler, tıp öğrencileri ve binlerce kart yöneten kullanıcılar için güçlü bir seçenektir. Fakat her ayarı değiştirmek zorunda değilsiniz; varsayılanlarla başlayıp gerçek ihtiyaca göre ilerlemek daha sağlıklıdır.</p>

<h3 id="mnemosyne-gösterişsiz-ama-disiplinli">Mnemosyne: Gösterişsiz ama disiplinli</h3>

<p>Adını Yunan mitolojisindeki hafıza tanrıçasından alan Mnemosyne, aralıklı tekrar dünyasının köklü araçlarındandır. Arayüzü modern uygulamalar kadar parlak görünmeyebilir; buna karşın kart oluşturma ve puanlama akışı nettir. Açık kaynak yaklaşımı ve araştırma odaklı geçmişi önemli avantajlarıdır.</p>

<p>“Not sistemi değil, yalnızca düzgün çalışan bir tekrar aracı istiyorum” diyorsanız Mnemosyne mantıklı bir adaydır. Daha küçük eklenti ekosistemi ve sınırlı görsel cilası ise bazı kullanıcıları Anki veya Mochi’ye yöneltebilir.</p>

<h3 id="mochi-not-alırken-kart-üretmek">Mochi: Not alırken kart üretmek</h3>

<p>Mochi, Markdown notları ile flashcard sistemini aynı ortamda buluşturur. Kartlar arasında bağlantı kurabilmek, tek tek gerçekleri ezberlemek yerine kavram ağı oluşturmayı kolaylaştırır. Özellikle yazılım, tarih veya felsefe gibi ilişkisel konularda bu yaklaşım değerlidir.</p>

<p>Ancak zengin bağlantılar kurmak, otomatik olarak iyi öğrenme anlamına gelmez. Kartlar kısa, açık ve tek bir bilgiyi ölçer durumda olmalıdır. Ayrıca çevrim içi özellikler ve ücretlendirme seçenekleri zamanla değişebileceğinden güncel planlar kontrol edilmelidir.</p>

<h2 id="mini-bir-zamanlayıcı-nasıl-çalışır">Mini bir zamanlayıcı nasıl çalışır?</h2>

<p>Aşağıdaki Python kodu, doğru yanıtta aralığı büyüten, yanlış yanıtta kartı ertesi güne döndüren basitleştirilmiş bir modeldir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">sonraki_aralik</span><span class="p">(</span><span class="n">mevcut_gun</span><span class="p">,</span> <span class="n">puan</span><span class="p">,</span> <span class="n">kolaylik</span><span class="o">=</span><span class="mf">2.2</span><span class="p">):</span>
    <span class="c1"># 0-2 başarısız, 3-5 başarılı kabul edilir.
</span>    <span class="k">if</span> <span class="n">puan</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">:</span>
        <span class="k">return</span> <span class="mi">1</span>

    <span class="n">performans</span> <span class="o">=</span> <span class="mf">0.8</span> <span class="o">+</span> <span class="p">(</span><span class="n">puan</span> <span class="o">-</span> <span class="mi">3</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.2</span>
    <span class="n">yeni_aralik</span> <span class="o">=</span> <span class="n">mevcut_gun</span> <span class="o">*</span> <span class="n">kolaylik</span> <span class="o">*</span> <span class="n">performans</span>
    <span class="k">return</span> <span class="nf">max</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nf">round</span><span class="p">(</span><span class="n">yeni_aralik</span><span class="p">))</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">sonraki_aralik</span><span class="p">(</span><span class="mi">7</span><span class="p">,</span> <span class="mi">4</span><span class="p">))</span>  <span class="c1"># Yaklaşık 15 gün
</span></code></pre></div></div>

<p>Bu örnek öğreticidir; gerçek planlayıcılar çok daha fazla veri kullanır. Yine de temel fikir açıktır: başarı aralığı büyütür, başarısızlık kartı yaklaştırır.</p>

<h2 id="hangisini-seçmeli">Hangisini seçmeli?</h2>

<p>Maksimum özelleştirme ve büyük deste yönetimi için <strong>Anki</strong>, sade ve açık kaynaklı bir çalışma düzeni için <strong>Mnemosyne</strong>, bağlantılı Markdown notlarıyla öğrenmek için <strong>Mochi</strong> öne çıkar. En iyi sistem, en gelişmiş algoritmaya sahip olan değil, her gün açmayı sürdürebildiğiniz sistemdir. Önce 20 kartlık küçük bir deste hazırlayın, bir hafta deneyin ve kararınızı gerçek çalışma alışkanlığınıza göre verin.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Program" /><category term="flashcard" /><category term="anki" /><category term="mnemosyne" /><category term="mochi" /><category term="aralıklı tekrar" /><category term="öğrenme" /><summary type="html"><![CDATA[Bir bilgiyi öğrenmek kolay, onu üç ay sonra hatırlamak ise bambaşka bir oyundur. Flashcard uygulamaları bu oyunda beynimize küçük ama düzenli paslar atar. Anki, Mnemosyne ve Mochi aynı temel fikri, yani aralıklı tekrarı, farklı arayüzler ve çalışma modelleriyle uygular. Gelin bu üç aracı karşılaştıralım ve kartların neden doğru zamanda karşımıza çıktığını anlayalım.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/flashcard-arenasinda-uc-93.png" /><media:content medium="image" url="https://program.sonsuz.us/img/flashcard-arenasinda-uc-93.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">İkili Ağaçlarda Dolaşma: Ön Sıra, Orta Sıra ve Son Sıra</title><link href="https://program.sonsuz.us/posts/ikili-agaclarda-dolasma-on-sira-orta-sira-ve-son-sira/" rel="alternate" type="text/html" title="İkili Ağaçlarda Dolaşma: Ön Sıra, Orta Sıra ve Son Sıra" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/ikili-agaclarda-dolasma-on-sira-orta-sira-ve-son-sira</id><content type="html" xml:base="https://program.sonsuz.us/posts/ikili-agaclarda-dolasma-on-sira-orta-sira-ve-son-sira/"><![CDATA[<p><img src="/img/ikili-agaclarda-dolasma-65.svg" alt="ikili-agaclarda-dolasma-65" /></p>

<p>Ağaçlar; dosya sistemlerinden arama motorlarına, derleyicilerden oyunlardaki karar mekanizmalarına kadar birçok alanda kullanılan hiyerarşik veri yapılarıdır. Ancak düğümleri dallara yerleştirmek tek başına yeterli değildir: Bilgiye ulaşabilmek için ağacı sistemli biçimde dolaşmamız gerekir. İkili ağaçlarda en yaygın derinlik öncelikli yöntemler ön sıra, orta sıra ve son sıra dolaşmadır.</p>

<p>``</p>

<h2 id="i̇kili-ağaç-nedir">İkili ağaç nedir?</h2>

<p>İkili ağaçta her düğümün en fazla iki çocuğu bulunur: <strong>sol çocuk</strong> ve <strong>sağ çocuk</strong>. En üstteki düğüme kök, çocuğu olmayan düğümlere ise yaprak denir.</p>

<p>Örnek olarak aşağıdaki ağacı düşünelim:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>        8
       / \
      3   10
     / \    \
    1   6    14
</code></pre></div></div>

<p>Dolaşma yöntemleri arasındaki temel fark, kök düğümün ne zaman ziyaret edildiğidir. Buradaki “ziyaret”, değeri yazdırmak, toplamak, karşılaştırmak veya başka bir işlem gerçekleştirmek anlamına gelebilir.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Ziyaret sırası</th>
      <th>Örnek sonuç</th>
      <th>Tipik kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ön sıra</td>
      <td>Kök → Sol → Sağ</td>
      <td>8, 3, 1, 6, 10, 14</td>
      <td>Ağacı kopyalama, serileştirme</td>
    </tr>
    <tr>
      <td>Orta sıra</td>
      <td>Sol → Kök → Sağ</td>
      <td>1, 3, 6, 8, 10, 14</td>
      <td>Sıralı değer üretme</td>
    </tr>
    <tr>
      <td>Son sıra</td>
      <td>Sol → Sağ → Kök</td>
      <td>1, 6, 3, 14, 10, 8</td>
      <td>Silme, bağımlılık çözme</td>
    </tr>
  </tbody>
</table>

<h2 id="ön-sıra-dolaşma">Ön sıra dolaşma</h2>

<p>Ön sıra dolaşmada kök, çocuklarından önce işlenir. Bu nedenle hiyerarşik yapıyı dışarı aktarmak veya ağacın bir kopyasını oluşturmak için kullanışlıdır. Kökün önce bilinmesi, alt dalların hangi üst düğüme bağlanacağını belirlemeyi kolaylaştırır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">preorder</span><span class="p">(</span><span class="n">node</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">node</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">return</span>

    <span class="nf">print</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">value</span><span class="p">)</span>       <span class="c1"># Önce kökü işle
</span>    <span class="nf">preorder</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">)</span>     <span class="c1"># Ardından sol alt ağacı dolaş
</span>    <span class="nf">preorder</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">)</span>    <span class="c1"># Son olarak sağ alt ağacı dolaş
</span></code></pre></div></div>

<p>Bir klasör yapısında önce klasör adını, ardından içindeki dosya ve alt klasörleri göstermek bu yaklaşıma benzer.</p>

<h2 id="orta-sıra-dolaşma">Orta sıra dolaşma</h2>

<p>Orta sırada kök, sol ve sağ alt ağaçların arasında ziyaret edilir. Bu yöntem özellikle <strong>ikili arama ağaçlarında</strong> önemlidir. İkili arama ağacında sol taraftaki değerler kökten küçük, sağ taraftakiler büyüktür. Dolayısıyla orta sıra dolaşma değerleri küçükten büyüğe üretir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">inorder</span><span class="p">(</span><span class="n">node</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">node</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">return</span>

    <span class="nf">inorder</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">)</span>      <span class="c1"># Küçük değerleri gez
</span>    <span class="nf">print</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">value</span><span class="p">)</span>       <span class="c1"># Kökü işle
</span>    <span class="nf">inorder</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">)</span>     <span class="c1"># Büyük değerleri gez
</span></code></pre></div></div>

<p>Bu özellik, ayrıca bir sıralama algoritması çalıştırmadan düzenli çıktı alınmasını sağlar. Fakat aynı sonuç sıradan bir ikili ağaç için garanti edilmez; ağacın ikili arama ağacı kurallarına uyması gerekir.</p>

<h2 id="son-sıra-dolaşma">Son sıra dolaşma</h2>

<p>Son sıra dolaşmada kök en son işlenir. Başka bir deyişle, ebeveyn üzerinde işlem yapılmadan önce bütün çocuklar tamamlanır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">postorder</span><span class="p">(</span><span class="n">node</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">node</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">return</span>

    <span class="nf">postorder</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">left</span><span class="p">)</span>    <span class="c1"># Sol bağımlılıkları tamamla
</span>    <span class="nf">postorder</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">right</span><span class="p">)</span>   <span class="c1"># Sağ bağımlılıkları tamamla
</span>    <span class="nf">print</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">value</span><span class="p">)</span>       <span class="c1"># En son kökü işle
</span></code></pre></div></div>

<p>Bu yöntem ağacı bellekten güvenli biçimde silmek için idealdir. Önce çocuk düğümler kaldırılır, sonra ebeveyn silinir. İfade ağaçlarında hesaplama yapmak da benzer mantıktadır: Operatör uygulanmadan önce iki operandın değeri hesaplanır.</p>

<h2 id="zaman-ve-alan-karmaşıklığı">Zaman ve alan karmaşıklığı</h2>

<p>Üç yöntem de her düğümü tam bir kez ziyaret eder. Düğüm sayısı $n$ ise çalışma süresi:</p>

\[T(n)=T(n_L)+T(n_R)+O(1)=O(n)\]

<p>Özyinelemeli çağrıların bellek maliyeti ağacın yüksekliğine, yani $h$ değerine bağlı olarak $O(h)$ olur. Dengeli ağaçta $h \approx \log_2 n$ iken tek tarafa yatmış bir ağaçta $h=n$ olabilir.</p>

<p>Kısacası seçim, “kökü ne zaman işlemeliyim?” sorusuna bağlıdır: Yapıyı yukarıdan aşağı kurmak için ön sıra, sıralı veri almak için orta sıra, çocukları ebeveynden önce tamamlamak için son sıra tercih edilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="ağaç yapıları" /><category term="ikili ağaç" /><category term="algoritma" /><category term="veri yapıları" /><category term="python" /><category term="özyineleme" /><summary type="html"><![CDATA[Ağaçlar; dosya sistemlerinden arama motorlarına, derleyicilerden oyunlardaki karar mekanizmalarına kadar birçok alanda kullanılan hiyerarşik veri yapılarıdır. Ancak düğümleri dallara yerleştirmek tek başına yeterli değildir: Bilgiye ulaşabilmek için ağacı sistemli biçimde dolaşmamız gerekir. İkili ağaçlarda en yaygın derinlik öncelikli yöntemler ön sıra, orta sıra ve son sıra dolaşmadır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/ikili-agaclarda-dolasma-65.png" /><media:content medium="image" url="https://program.sonsuz.us/img/ikili-agaclarda-dolasma-65.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Karatsuba Çarpımı: Büyük Sayıları Böl ve Fethet</title><link href="https://program.sonsuz.us/posts/karatsuba-carpimi-buyuk-sayilari-bol-ve-fethet/" rel="alternate" type="text/html" title="Karatsuba Çarpımı: Büyük Sayıları Böl ve Fethet" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/karatsuba-carpimi-buyuk-sayilari-bol-ve-fethet</id><content type="html" xml:base="https://program.sonsuz.us/posts/karatsuba-carpimi-buyuk-sayilari-bol-ve-fethet/"><![CDATA[<p>Bilgisayarınız iki küçük sayıyı göz açıp kapayıncaya kadar çarpabilir. Ancak binlerce veya milyonlarca basamak içeren sayılar söz konusu olduğunda, ilkokulda öğrendiğimiz klasik çarpma yöntemi pahalı hâle gelir. 1960 yılında Anatoly Karatsuba tarafından geliştirilen algoritma, zekice bir cebirsel dönüşüm kullanarak gereken küçük çarpma sayısını azaltır. Böylece büyük tam sayılarla çalışan kriptografi, matematik yazılımları ve bilimsel hesaplama sistemleri önemli ölçüde hızlanır.</p>

<p><img src="/img/karatsuba-carpimi-buyuk-26.svg" alt="karatsuba-carpimi-buyuk-26" /></p>

<p>``</p>

<h2 id="klasik-çarpmanın-maliyeti">Klasik çarpmanın maliyeti</h2>

<p>Her biri $n$ basamaklı iki sayıyı klasik yöntemle çarptığımızı düşünelim. Birinci sayının her basamağı, ikinci sayının bütün basamaklarıyla çarpılır. Yaklaşık olarak $n \times n = n^2$ tek basamaklı çarpma yapılır. Bu nedenle klasik yöntemin zaman karmaşıklığı $O(n^2)$ olur.</p>

<p>Karatsuba ise sayıları iki parçaya ayırır. Tabanı $B$ olan ve yaklaşık $2m$ basamak taşıyan iki sayı şöyle yazılabilir:</p>

\[x = aB^m + b\]

\[y = cB^m + d\]

<p>Normal açılım yapıldığında:</p>

\[xy = acB^{2m} + (ad + bc)B^m + bd\]

<p>Bu ifade doğrudan uygulanırsa $ac$, $ad$, $bc$ ve $bd$ olmak üzere dört çarpma gerekir. Karatsuba’nın numarası tam burada ortaya çıkar: ortadaki terim ayrı ayrı hesaplanmak zorunda değildir.</p>

\[ad + bc = (a+b)(c+d) - ac - bd\]

<p>Böylece yalnızca şu üç çarpım hesaplanır:</p>

<ul>
  <li>$z_2 = ac$</li>
  <li>$z_0 = bd$</li>
  <li>$z_1 = (a+b)(c+d) - z_2 - z_0$</li>
</ul>

<p>Sonuç ise $z_2B^{2m} + z_1B^m + z_0$ biçiminde birleştirilir. Dört çarpma yerine üç çarpma yapmak küçük sayılarda önemsiz görünebilir; fakat işlem her seviyede özyinelemeli tekrarlandığında fark kartopu gibi büyür.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th style="text-align: right">Klasik yöntem</th>
      <th style="text-align: right">Karatsuba</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Alt problem sayısı</td>
      <td style="text-align: right">4</td>
      <td style="text-align: right">3</td>
    </tr>
    <tr>
      <td>Alt problem boyutu</td>
      <td style="text-align: right">$n/2$</td>
      <td style="text-align: right">$n/2$</td>
    </tr>
    <tr>
      <td>Zaman karmaşıklığı</td>
      <td style="text-align: right">$O(n^2)$</td>
      <td style="text-align: right">$O(n^{\log_2 3})$</td>
    </tr>
    <tr>
      <td>Yaklaşık üs</td>
      <td style="text-align: right">2</td>
      <td style="text-align: right">1,585</td>
    </tr>
    <tr>
      <td>Küçük sayılardaki ek yük</td>
      <td style="text-align: right">Düşük</td>
      <td style="text-align: right">Daha yüksek</td>
    </tr>
  </tbody>
</table>

<p>Karatsuba’nın bağıntısı $T(n)=3T(n/2)+O(n)$ şeklindedir. Buradan karmaşıklık yaklaşık $O(n^{1.585})$ çıkar. Sayılar büyüdükçe bu üs farkı ciddi bir avantaj sağlar.</p>

<h2 id="python-ile-uygulama">Python ile uygulama</h2>

<p>Aşağıdaki fonksiyon sayıları onluk tabanda böler. Sayılar yeterince küçük olduğunda özyinelemeyi durdurup Python’ın normal çarpımını kullanır:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">karatsuba</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
    <span class="c1"># Küçük değerlerde ek özyineleme maliyetinden kaçın.
</span>    <span class="k">if</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="mi">10</span> <span class="ow">or</span> <span class="n">y</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">x</span> <span class="o">*</span> <span class="n">y</span>

    <span class="n">n</span> <span class="o">=</span> <span class="nf">max</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="nf">str</span><span class="p">(</span><span class="n">x</span><span class="p">)),</span> <span class="nf">len</span><span class="p">(</span><span class="nf">str</span><span class="p">(</span><span class="n">y</span><span class="p">)))</span>
    <span class="n">m</span> <span class="o">=</span> <span class="n">n</span> <span class="o">//</span> <span class="mi">2</span>
    <span class="n">taban</span> <span class="o">=</span> <span class="mi">10</span> <span class="o">**</span> <span class="n">m</span>

    <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="nf">divmod</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">taban</span><span class="p">)</span>
    <span class="n">c</span><span class="p">,</span> <span class="n">d</span> <span class="o">=</span> <span class="nf">divmod</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">taban</span><span class="p">)</span>

    <span class="n">z2</span> <span class="o">=</span> <span class="nf">karatsuba</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">c</span><span class="p">)</span>
    <span class="n">z0</span> <span class="o">=</span> <span class="nf">karatsuba</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">d</span><span class="p">)</span>
    <span class="n">z1</span> <span class="o">=</span> <span class="nf">karatsuba</span><span class="p">(</span><span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="o">+</span> <span class="n">d</span><span class="p">)</span> <span class="o">-</span> <span class="n">z2</span> <span class="o">-</span> <span class="n">z0</span>

    <span class="k">return</span> <span class="n">z2</span> <span class="o">*</span> <span class="p">(</span><span class="n">taban</span> <span class="o">**</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">z1</span> <span class="o">*</span> <span class="n">taban</span> <span class="o">+</span> <span class="n">z0</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">karatsuba</span><span class="p">(</span><span class="mi">12345678</span><span class="p">,</span> <span class="mi">87654321</span><span class="p">))</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">divmod</code>, bir sayının yüksek ve düşük basamaklarını tek adımda ayırır. Üç özyinelemeli çağrı gerekli ara çarpımları üretir; son satır da basamak kaydırmalarını onluk tabanın kuvvetleriyle gerçekleştirir.</p>

<h2 id="her-durumda-daha-mı-hızlı">Her durumda daha mı hızlı?</h2>

<p>Hayır. Özyinelemeli çağrılar, sayıları parçalama ve ara sonuçları toplama işlemleri ek maliyet oluşturur. Bu yüzden pratik kütüphaneler hibrit davranır: küçük sayılarda klasik çarpma, belirli bir basamak eşiğinden sonra Karatsuba kullanılır.</p>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th>Mantıklı tercih</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Birkaç basamaklı sayılar</td>
      <td>Klasik çarpma</td>
    </tr>
    <tr>
      <td>Yüzlerce veya binlerce basamak</td>
      <td>Karatsuba</td>
    </tr>
    <tr>
      <td>Aşırı büyük sayılar</td>
      <td>Toom-Cook veya FFT tabanlı yöntemler</td>
    </tr>
  </tbody>
</table>

<p>Karatsuba’nın asıl güzelliği, daha güçlü donanım istemeden cebir sayesinde işi azaltmasıdır. Böl ve fethet yaklaşımının yalnızca problemi küçültmek değil, gereksiz hesaplamaları ortadan kaldırmak anlamına da geldiğini gösteren klasik ve hâlâ etkileyici bir algoritmadır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="karatsuba" /><category term="algoritma" /><category term="böl-ve-fethet" /><category term="python" /><category term="matematik" /><category term="büyük-sayılar" /><summary type="html"><![CDATA[Bilgisayarınız iki küçük sayıyı göz açıp kapayıncaya kadar çarpabilir. Ancak binlerce veya milyonlarca basamak içeren sayılar söz konusu olduğunda, ilkokulda öğrendiğimiz klasik çarpma yöntemi pahalı hâle gelir. 1960 yılında Anatoly Karatsuba tarafından geliştirilen algoritma, zekice bir cebirsel dönüşüm kullanarak gereken küçük çarpma sayısını azaltır. Böylece büyük tam sayılarla çalışan kriptografi, matematik yazılımları ve bilimsel hesaplama sistemleri önemli ölçüde hızlanır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/karatsuba-carpimi-buyuk-26.png" /><media:content medium="image" url="https://program.sonsuz.us/img/karatsuba-carpimi-buyuk-26.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Master Teorem ile Özyinelemeli Karmaşıklık Hesabı</title><link href="https://program.sonsuz.us/posts/master-teorem-ile-ozyinelemeli-karmasiklik-hesabi/" rel="alternate" type="text/html" title="Master Teorem ile Özyinelemeli Karmaşıklık Hesabı" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/master-teorem-ile-ozyinelemeli-karmasiklik-hesabi</id><content type="html" xml:base="https://program.sonsuz.us/posts/master-teorem-ile-ozyinelemeli-karmasiklik-hesabi/"><![CDATA[<p>Böl-fethet algoritmalarında kod birkaç satır görünebilir; fakat çalışma süresini hesaplamak bazen matematiksel bir bilmeceye dönüşür. Master Teorem, belirli biçimdeki özyineleme bağıntılarını uzun uzun açmadan sonuca ulaştıran pratik bir araçtır. Merge Sort, ikili arama ve benzeri algoritmaların karmaşıklığını bu yöntemle hızlıca sınıflandırabiliriz.
``</p>
<h2 id="temel-fikir-problem-nasıl-parçalanıyor">Temel fikir: Problem nasıl parçalanıyor?</h2>

<p>Bir böl-fethet algoritması genellikle üç adım uygular: problemi alt problemlere böler, bunları özyinelemeli biçimde çözer ve sonuçları birleştirir. Bu sürecin çalışma süresi şu bağıntıyla ifade edilir:</p>

\[T(n) = aT\left(\frac{n}{b}\right) + f(n)\]

<p>Buradaki değişkenlerin görevleri şöyledir:</p>

<table>
  <thead>
    <tr>
      <th>Sembol</th>
      <th>Anlamı</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$a$</td>
      <td>Oluşturulan alt problem sayısı</td>
      <td>Merge Sort için 2</td>
    </tr>
    <tr>
      <td>$b$</td>
      <td>Problem boyutunun küçülme oranı</td>
      <td>Boyut yarıya iniyorsa 2</td>
    </tr>
    <tr>
      <td>$f(n)$</td>
      <td>Bölme ve birleştirme gibi özyineleme dışı işler</td>
      <td>Merge Sort için $n$</td>
    </tr>
    <tr>
      <td>$T(n)$</td>
      <td>Toplam çalışma süresi</td>
      <td>Aradığımız sonuç</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/master-teorem-ile-29.svg" alt="master-teorem-ile-29" /></p>

<p>Teoremin merkezindeki karşılaştırma, $f(n)$ ile $n^{\log_b a}$ arasındadır. İkinci ifade, özyineleme ağacındaki alt problemlerin ürettiği temel iş yükünü temsil eder. Kısacası şu soruyu sorarız: Maliyeti alt problemler mi, her seviyede yapılan ek iş mi, yoksa ikisi birlikte mi büyütüyor?</p>

<h2 id="master-teoremin-üç-durumu">Master Teorem’in üç durumu</h2>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th>Karşılaştırma</th>
      <th>Sonuç</th>
      <th>Baskın bölüm</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>$f(n)=O(n^{\log_b a-\varepsilon})$</td>
      <td>$\Theta(n^{\log_b a})$</td>
      <td>Alt problemler</td>
    </tr>
    <tr>
      <td>2</td>
      <td>$f(n)=\Theta(n^{\log_b a}\log^k n)$</td>
      <td>$\Theta(n^{\log_b a}\log^{k+1}n)$</td>
      <td>Dengeli</td>
    </tr>
    <tr>
      <td>3</td>
      <td>$f(n)=\Omega(n^{\log_b a+\varepsilon})$</td>
      <td>$\Theta(f(n))$</td>
      <td>Ek iş</td>
    </tr>
  </tbody>
</table>

<p>Buradaki $\varepsilon&gt;0$, fonksiyonlar arasında polinom düzeyinde bir fark bulunduğunu belirtir. Üçüncü durumda ayrıca düzenlilik koşulu aranır: Yeterince büyük $n$ değerleri için $af(n/b)\leq cf(n)$ ve $c&lt;1$ olmalıdır.</p>

<h2 id="örnek-merge-sort">Örnek: Merge Sort</h2>

<p>Merge Sort diziyi iki eşit parçaya ayırır, iki parçayı ayrı ayrı sıralar ve doğrusal zamanda birleştirir:</p>

\[T(n)=2T(n/2)+n\]

<p>Buradan $a=2$, $b=2$ ve $f(n)=n$ elde edilir. Kritik terim:</p>

\[n^{\log_2 2}=n\]

<p>$f(n)$ ile kritik terim eşit büyüdüğü için ikinci durum geçerlidir. Sonuç:</p>

\[T(n)=\Theta(n\log n)\]

<p>Aşağıdaki Python kodu bu yapının algoritmadaki karşılığını gösterir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">merge_sort</span><span class="p">(</span><span class="n">items</span><span class="p">):</span>
    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">items</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">items</span>

    <span class="n">middle</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">items</span><span class="p">)</span> <span class="o">//</span> <span class="mi">2</span>
    <span class="n">left</span> <span class="o">=</span> <span class="nf">merge_sort</span><span class="p">(</span><span class="n">items</span><span class="p">[:</span><span class="n">middle</span><span class="p">])</span>
    <span class="n">right</span> <span class="o">=</span> <span class="nf">merge_sort</span><span class="p">(</span><span class="n">items</span><span class="p">[</span><span class="n">middle</span><span class="p">:])</span>
    <span class="k">return</span> <span class="nf">merge</span><span class="p">(</span><span class="n">left</span><span class="p">,</span> <span class="n">right</span><span class="p">)</span>
</code></pre></div></div>

<p>İki özyinelemeli çağrı $2T(n/2)$ terimini, <code class="language-plaintext highlighter-rouge">merge</code> işlemi ise doğrusal $n$ maliyetini oluşturur.</p>

<h2 id="i̇ki-kısa-karşılaştırma">İki kısa karşılaştırma</h2>

<p>İkili aramada yalnızca bir yarı seçilir:</p>

\[T(n)=T(n/2)+1\]

<p>$a=1$, $b=2$ ve $f(n)=1$ olduğundan $n^{\log_2 1}=1$ bulunur. İkinci durum sonucunda karmaşıklık $\Theta(\log n)$ olur.</p>

<p>Şu bağıntıda ise birleştirme işi daha pahalıdır:</p>

\[T(n)=2T(n/2)+n^2\]

<p>Kritik terim $n$ iken $f(n)=n^2$ daha hızlı büyür. Düzenlilik koşulu da sağlandığından üçüncü durum uygulanır ve sonuç $\Theta(n^2)$ çıkar.</p>

<h2 id="ne-zaman-kullanılamaz">Ne zaman kullanılamaz?</h2>

<p>Master Teorem her özyineleme bağıntısına uymaz. Alt problemlerin eşit boyutta olmadığı $T(n)=T(n/3)+T(2n/3)+n$ veya boyutun sabit miktarda azaldığı $T(n)=T(n-1)+n$ biçimleri doğrudan kapsam dışındadır. Böyle durumlarda özyineleme ağacı, yerine koyma yöntemi ya da Akra–Bazzi teoremi tercih edilebilir.</p>

<p>Pratik reçete basittir: Önce $a$, $b$ ve $f(n)$ değerlerini çıkarın; ardından $n^{\log_b a}$ terimini hesaplayın ve $f(n)$ ile karşılaştırın. Üç durumdan doğru olanı seçtiğinizde, karmaşıklık hesabı korkutucu bir denklem olmaktan çıkıp kısa bir eşleştirme oyununa dönüşür.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="master teorem" /><category term="algoritma" /><category term="karmaşıklık" /><category term="özyineleme" /><category term="böl ve fethet" /><summary type="html"><![CDATA[Böl-fethet algoritmalarında kod birkaç satır görünebilir; fakat çalışma süresini hesaplamak bazen matematiksel bir bilmeceye dönüşür. Master Teorem, belirli biçimdeki özyineleme bağıntılarını uzun uzun açmadan sonuca ulaştıran pratik bir araçtır. Merge Sort, ikili arama ve benzeri algoritmaların karmaşıklığını bu yöntemle hızlıca sınıflandırabiliriz.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/master-teorem-ile-29.png" /><media:content medium="image" url="https://program.sonsuz.us/img/master-teorem-ile-29.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Özyinelemeli Fibonacci: Üstel Zamandan Memoizasyonla Doğrusal Zamana</title><link href="https://program.sonsuz.us/posts/ozyinelemeli-fibonacci-ustel-zamandan-memoizasyonla-dogrusal-zamana/" rel="alternate" type="text/html" title="Özyinelemeli Fibonacci: Üstel Zamandan Memoizasyonla Doğrusal Zamana" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/ozyinelemeli-fibonacci-ustel-zamandan-memoizasyonla-dogrusal-zamana</id><content type="html" xml:base="https://program.sonsuz.us/posts/ozyinelemeli-fibonacci-ustel-zamandan-memoizasyonla-dogrusal-zamana/"><![CDATA[<p><img src="/img/ozyinelemeli-fibonacci-ustel-96.svg" alt="ozyinelemeli-fibonacci-ustel-96" /></p>

<p>Fibonacci dizisi, algoritma öğrenirken karşımıza çıkan en ünlü örneklerden biridir. Tanımı son derece basit görünür: Her sayı, kendisinden önce gelen iki sayının toplamıdır. Ancak bu masum tanımı saf özyineleme ile doğrudan koda çevirdiğimizde bilgisayarımız aynı işlemleri tekrar tekrar yapmaya başlar. Gelin bu performans tuzağının neden oluştuğunu ve memoizasyonun onu nasıl ortadan kaldırdığını inceleyelim.</p>

<p>``</p>

<h2 id="fibonacci-dizisinin-matematiksel-tanımı">Fibonacci dizisinin matematiksel tanımı</h2>

<p>Dizinin başlangıç değerlerini $F(0)=0$ ve $F(1)=1$ olarak kabul edelim. Geri kalan terimler şu bağıntıyla hesaplanır:</p>

\[F(n)=F(n-1)+F(n-2), \quad n \ge 2\]

<p>Böylece dizi $0, 1, 1, 2, 3, 5, 8, 13, \ldots$ biçiminde ilerler. Matematiksel tanımın kendi kendisine başvurması, özyinelemeli bir program yazmayı oldukça doğal hâle getirir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">n</span>

    <span class="k">return</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">fibonacci</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span>  <span class="c1"># 55
</span></code></pre></div></div>

<p>Bu fonksiyon önce taban durumu kontrol eder. $n$, sıfır veya bir olduğunda doğrudan sonucu döndürür; aksi hâlde önceki iki Fibonacci değerini ayrı çağrılarla hesaplar. Kod kısa, okunabilir ve matematiksel tanıma neredeyse birebir uygundur. Ne yazık ki kısa kod her zaman hızlı kod değildir.</p>

<h2 id="saf-özyineleme-neden-yavaştır">Saf özyineleme neden yavaştır?</h2>

<p>$fibonacci(5)$ çağrıldığında fonksiyon hem $fibonacci(4)$ hem de $fibonacci(3)$ çağrılarını oluşturur. Ardından $fibonacci(4)$, kendi içinde $fibonacci(3)$ değerini yeniden hesaplar. Yani aynı alt problem birden fazla kez çözülür.</p>

<p>Çağrı sayısını yaklaşık olarak şu bağıntı ifade eder:</p>

\[T(n)=T(n-1)+T(n-2)+O(1)\]

<p>Bu yapı Fibonacci dizisine benzediği için çalışma süresi yaklaşık $O(\varphi^n)$ olur. Buradaki $\varphi \approx 1.618$, altın orandır. Karmaşıklık çoğu zaman daha genel bir üst sınırla $O(2^n)$ şeklinde de gösterilir. Her yeni değer, çağrı ağacını hızla büyütür; bilgisayar adeta daha önce çözdüğü soruların cevaplarını unutup tekrar sınava girer.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th style="text-align: right">Zaman karmaşıklığı</th>
      <th style="text-align: right">Alan karmaşıklığı</th>
      <th>Tekrarlanan hesaplama</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Saf özyineleme</td>
      <td style="text-align: right">$O(2^n)$</td>
      <td style="text-align: right">$O(n)$</td>
      <td>Çok fazla</td>
    </tr>
    <tr>
      <td>Memoizasyon</td>
      <td style="text-align: right">$O(n)$</td>
      <td style="text-align: right">$O(n)$</td>
      <td>Yok</td>
    </tr>
    <tr>
      <td>Döngüsel çözüm</td>
      <td style="text-align: right">$O(n)$</td>
      <td style="text-align: right">$O(1)$</td>
      <td>Yok</td>
    </tr>
  </tbody>
</table>

<h2 id="memoizasyon-ile-sonuçları-hatırlamak">Memoizasyon ile sonuçları hatırlamak</h2>

<p>Memoizasyon, hesaplanan sonuçları bir önbellekte saklar. Fonksiyon aynı $n$ değeriyle yeniden çağrıldığında bütün çağrı ağacını tekrar kurmak yerine hazır sonucu döndürür.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">cache</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
    <span class="c1"># Sözlüğü yalnızca ilk çağrıda oluştururuz.
</span>    <span class="k">if</span> <span class="n">cache</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
        <span class="n">cache</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span> <span class="mi">1</span><span class="p">}</span>

    <span class="c1"># Daha önce hesaplandıysa doğrudan kullanırız.
</span>    <span class="k">if</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">cache</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">cache</span><span class="p">[</span><span class="n">n</span><span class="p">]</span>

    <span class="n">cache</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">cache</span><span class="p">)</span> <span class="o">+</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">2</span><span class="p">,</span> <span class="n">cache</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">cache</span><span class="p">[</span><span class="n">n</span><span class="p">]</span>

<span class="nf">print</span><span class="p">(</span><span class="nf">fibonacci</span><span class="p">(</span><span class="mi">40</span><span class="p">))</span>  <span class="c1"># 102334155
</span></code></pre></div></div>

<p>Bu sürümde $F(0)$ ile $F(n)$ arasındaki her değer en fazla bir kez hesaplanır. Her hesaplama sabit zamanlı sözlük erişimleri yaptığı için toplam süre $O(n)$ seviyesine iner. Önbellek ve çağrı yığını ise $O(n)$ alan kullanır.</p>

<p>Python, aynı fikri hazır bir dekoratörle uygulamamıza da izin verir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">functools</span> <span class="kn">import</span> <span class="n">cache</span>

<span class="nd">@cache</span>
<span class="k">def</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">n</span> <span class="o">&lt;=</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">n</span>
    <span class="k">return</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="nf">fibonacci</span><span class="p">(</span><span class="n">n</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span>
</code></pre></div></div>

<h2 id="hangi-yöntemi-seçmeliyiz">Hangi yöntemi seçmeliyiz?</h2>

<p>Saf özyineleme, algoritmanın matematiksel yapısını göstermek için harikadır; fakat büyük girdilerde pratik değildir. Memoizasyon, okunabilir özyinelemeli yapıyı korurken performansı dramatik biçimde iyileştirir. Yalnızca sonuca ihtiyaç duyuluyorsa döngüsel yaklaşım daha az bellek tüketebilir. Buradaki temel ders Fibonacci’den büyüktür: Bir problem örtüşen alt problemlere sahipse, daha önce hesaplanan sonuçları saklamak üstel bir algoritmayı doğrusal bir çözüme dönüştürebilir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="fibonacci" /><category term="özyineleme" /><category term="memoizasyon" /><category term="algoritma" /><category term="dinamik programlama" /><category term="python" /><summary type="html"><![CDATA[Fibonacci dizisi, algoritma öğrenirken karşımıza çıkan en ünlü örneklerden biridir. Tanımı son derece basit görünür: Her sayı, kendisinden önce gelen iki sayının toplamıdır. Ancak bu masum tanımı saf özyineleme ile doğrudan koda çevirdiğimizde bilgisayarımız aynı işlemleri tekrar tekrar yapmaya başlar. Gelin bu performans tuzağının neden oluştuğunu ve memoizasyonun onu nasıl ortadan kaldırdığını inceleyelim.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/ozyinelemeli-fibonacci-ustel-96.png" /><media:content medium="image" url="https://program.sonsuz.us/img/ozyinelemeli-fibonacci-ustel-96.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Rastgele Soru Üretme Sistemleri: H5P, Moodle Question Bank ve Özel Algoritmalar</title><link href="https://program.sonsuz.us/posts/rastgele-soru-uretme-sistemleri-h5p-moodle-question-bank-ve-ozel-algoritmalar/" rel="alternate" type="text/html" title="Rastgele Soru Üretme Sistemleri: H5P, Moodle Question Bank ve Özel Algoritmalar" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/rastgele-soru-uretme-sistemleri-h5p-moodle-question-bank-ve-ozel-algoritmalar</id><content type="html" xml:base="https://program.sonsuz.us/posts/rastgele-soru-uretme-sistemleri-h5p-moodle-question-bank-ve-ozel-algoritmalar/"><![CDATA[<p>Her öğrenciye farklı görünen ama aynı kazanımı ölçen bir sınav hazırlamak, eğitim teknolojilerinin en eğlenceli problemlerinden biridir. Rastgele soru üretme sistemleri; hazır bir havuzdan soru seçebilir, seçeneklerin sırasını değiştirebilir veya matematiksel parametrelerden yepyeni sorular oluşturabilir. H5P hızlı etkileşimler, Moodle Question Bank kapsamlı sınav yönetimi, özel algoritmalar ise neredeyse sınırsız üretim özgürlüğü sunar.</p>

<p>``</p>

<h2 id="rastgelelik-gerçekte-ne-anlama-gelir">Rastgelelik gerçekte ne anlama gelir?</h2>

<p>Bir sistemde $N$ adet soru varsa ve sınav için bunlardan $k$ tanesi eşit olasılıkla seçiliyorsa, belirli bir sorunun sınava girme olasılığı yaklaşık olarak</p>

\[P(\text{sorunun seçilmesi}) = \frac{k}{N}\]

<p>olur. Örneğin 100 soruluk havuzdan 20 soru seçildiğinde her sorunun sınavda görünme olasılığı $0.20$ seviyesindedir. Ancak gerçek kalite yalnızca rastgele seçimden gelmez. Zorluk, konu dağılımı ve öğrenme çıktıları da dengelenmelidir.</p>

<p>Daha kontrollü bir modelde sınav; 4 kolay, 4 orta ve 2 zor sorudan oluşturulabilir. Buna <strong>katmanlı rastgele seçim</strong> denir. Böylece bir öğrenci tamamen kolay, başka biri tamamen zor bir sınavla karşılaşmaz.</p>

<h2 id="üç-yaklaşımın-karşılaştırması">Üç yaklaşımın karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Güçlü yanı</th>
      <th>Sınırlaması</th>
      <th>En uygun kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>H5P</td>
      <td>Görsel ve etkileşimli içerik</td>
      <td>Gelişmiş soru üretimi sınırlı</td>
      <td>Ders içi alıştırmalar</td>
    </tr>
    <tr>
      <td>Moodle Question Bank</td>
      <td>Kategori, etiket ve sınav analizi</td>
      <td>Yapılandırma zaman alabilir</td>
      <td>Ölçme ve değerlendirme</td>
    </tr>
    <tr>
      <td>Özel algoritma</td>
      <td>Parametrik ve sınırsız üretim</td>
      <td>Yazılım geliştirme gerektirir</td>
      <td>Uyarlanabilir sınavlar</td>
    </tr>
  </tbody>
</table>

<h2 id="h5p-ile-hızlı-etkileşim">H5P ile hızlı etkileşim</h2>

<p>H5P; Multiple Choice, Fill in the Blanks ve Question Set gibi içerik türleriyle çalışır. Seçenek sıralaması karıştırılabilir ve bir soru setinden belirli sayıda içerik gösterilebilir. En büyük avantajı, öğrencinin anında geri bildirim almasıdır.</p>

<p>Bununla birlikte H5P çoğunlukla önceden hazırlanmış içerikleri rastgele sunar. Örneğin her seferinde farklı katsayılara sahip bir denklem oluşturmak istiyorsanız ek JavaScript geliştirmesi veya harici bir servis gerekebilir.</p>

<h2 id="moodle-question-bank-ile-kontrollü-seçim">Moodle Question Bank ile kontrollü seçim</h2>

<p>Moodle soruları kategoriler altında saklayabilir. “Cebir/Kolay” ve “Cebir/Zor” gibi kategoriler oluşturup sınava her kategoriden rastgele soru eklemek mümkündür. Ayrıca <strong>Calculated Question</strong> türü, değişkenleri belirli aralıklardan seçerek parametrik sorular üretir.</p>

<p>Örneğin $a$ ve $b$ rastgele seçildiğinde öğrenciye $a+b$ sorulabilir. $a \in [2,10]$ ve $b \in [5,20]$ tanımlanırsa sistem çok sayıda varyasyon oluşturur. Tolerans, birim ve ondalık hassasiyeti gibi ayrıntılar da Moodle üzerinden yönetilebilir.</p>

<h2 id="özel-algoritma-nasıl-kurulur">Özel algoritma nasıl kurulur?</h2>

<p>Basit bir JavaScript fonksiyonu, iki katsayı seçip birinci dereceden denklem üretebilir:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">denklemUret</span><span class="p">()</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">x</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">9</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
  <span class="kd">const</span> <span class="nx">a</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">8</span><span class="p">)</span> <span class="o">+</span> <span class="mi">2</span><span class="p">;</span>
  <span class="kd">const</span> <span class="nx">b</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">20</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>

  <span class="k">return</span> <span class="p">{</span>
    <span class="na">soru</span><span class="p">:</span> <span class="s2">`</span><span class="p">${</span><span class="nx">a</span><span class="p">}</span><span class="s2">x + </span><span class="p">${</span><span class="nx">b</span><span class="p">}</span><span class="s2"> = </span><span class="p">${</span><span class="nx">a</span> <span class="o">*</span> <span class="nx">x</span> <span class="o">+</span> <span class="nx">b</span><span class="p">}</span><span class="s2"> denkleminde x kaçtır?`</span><span class="p">,</span>
    <span class="na">cevap</span><span class="p">:</span> <span class="nx">x</span>
  <span class="p">};</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">denklemUret</span><span class="p">());</span>
</code></pre></div></div>

<p>Kod önce doğru cevabı belirler, ardından bu cevaba uygun denklem kurar. Bu yaklaşım önemlidir; rastgele bir soru üretip sonradan çözmeye çalışmak yerine, <strong>cevaptan soruya doğru üretim</strong> hatalı veya çözümsüz örneklerin önüne geçer.</p>

<h2 id="adil-ve-güvenilir-bir-sistem-için">Adil ve güvenilir bir sistem için</h2>

<p>Gerçek sınavlarda sözde rastgele sayı üreteci için bir <code class="language-plaintext highlighter-rouge">seed</code> saklamak yararlıdır. Aynı seed kullanıldığında aynı sınav yeniden oluşturulabilir; böylece öğrenci itirazları incelenebilir. Ayrıca algoritma şu kontrollerden geçmelidir:</p>

<ul>
  <li>Aynı sorunun sınav içinde tekrarlanmaması</li>
  <li>Yanlış seçeneklerin doğru cevaptan farklı olması</li>
  <li>Zorluk dağılımının korunması</li>
  <li>Üretilen değerlerin anlamlı aralıklarda kalması</li>
  <li>Soru sürümlerinin ve seed bilgilerinin kaydedilmesi</li>
</ul>

<p>Hızlı ve görsel etkinliklerde H5P, kurumsal sınavlarda Moodle, benzersiz ve uyarlanabilir senaryolarda ise özel algoritmalar öne çıkar. En güçlü çözüm çoğu zaman bunları yarıştırmak değil, H5P’nin etkileşimini Moodle’ın soru bankası ve özel bir üretim servisinin esnekliğiyle birleştirmektir.</p>

<p><img src="/img/rastgele-soru-uretme-18.svg" alt="rastgele-soru-uretme-18" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="h5p" /><category term="moodle" /><category term="soru-bankası" /><category term="algoritma" /><category term="eğitim-teknolojileri" /><category term="rastgeleleştirme" /><summary type="html"><![CDATA[Her öğrenciye farklı görünen ama aynı kazanımı ölçen bir sınav hazırlamak, eğitim teknolojilerinin en eğlenceli problemlerinden biridir. Rastgele soru üretme sistemleri; hazır bir havuzdan soru seçebilir, seçeneklerin sırasını değiştirebilir veya matematiksel parametrelerden yepyeni sorular oluşturabilir. H5P hızlı etkileşimler, Moodle Question Bank kapsamlı sınav yönetimi, özel algoritmalar ise neredeyse sınırsız üretim özgürlüğü sunar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/rastgele-soru-uretme-18.png" /><media:content medium="image" url="https://program.sonsuz.us/img/rastgele-soru-uretme-18.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>