{"id":43652,"date":"2026-07-27T21:06:25","date_gmt":"2026-07-27T18:06:25","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/"},"modified":"2026-07-27T21:06:44","modified_gmt":"2026-07-27T18:06:44","slug":"cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/","title":{"rendered":"C++&#8217;ta \u00d6zyineleme: Temel Durumdan Y\u0131\u011f\u0131n Ta\u015fmas\u0131na Kadar Basit Bir Bak\u0131\u015f"},"content":{"rendered":"<h2>C++&#8217;ta \u00d6zyineleme: Temel Durumdan Y\u0131\u011f\u0131n Ta\u015fmas\u0131na Kadar Basit Bir Bak\u0131\u015f<\/h2>\n<p>C++ programlamada kar\u015f\u0131la\u015f\u0131lan karma\u015f\u0131k sorunlar\u0131 zarif ve etkili bir \u015fekilde \u00e7\u00f6zmek i\u00e7in \u00f6zyineleme (recursion) g\u00fc\u00e7l\u00fc bir tekniktir. Bu makalede, \u00f6zyinelemenin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, temel durum (base case) ve \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131 (call stack) gibi kritik bile\u015fenlerini, LIFO prensibini ve potansiyel tehlikesi olan y\u0131\u011f\u0131n ta\u015fmas\u0131n\u0131 (stack overflow) basit \u00f6rneklerle a\u00e7\u0131klayaca\u011f\u0131z. E\u011fer kendini tekrar eden bir problemi \u00e7\u00f6zmek i\u00e7in en sade yolu ar\u0131yorsan, do\u011fru yerdesin.<\/p>\n<h3>\u00d6zyineleme Nedir ve Neden \u00d6nemlidir?<\/h3>\n<p>\u00d6zyineleme, bir fonksiyonun kendi kendini \u00e7a\u011f\u0131rmas\u0131 prensibine dayan\u0131r. Bu, kula\u011fa biraz tuhaf gelse de, belirli t\u00fcrdeki problemleri, \u00f6zellikle de daha k\u00fc\u00e7\u00fck, benzer alt problemlere b\u00f6l\u00fcnebilenleri \u00e7\u00f6zmek i\u00e7in inan\u0131lmaz derecede sezgisel ve g\u00fc\u00e7l\u00fc bir y\u00f6ntemdir. Bir problemi daha k\u00fc\u00e7\u00fck, ayn\u0131 yap\u0131daki par\u00e7alara ay\u0131rmak ve her par\u00e7ay\u0131 ayn\u0131 fonksiyonla \u00e7\u00f6zmek, \u00f6zyinelemenin temel mant\u0131\u011f\u0131n\u0131 olu\u015fturur. \u00d6rne\u011fin, bir dosya sistemindeki t\u00fcm klas\u00f6rleri ve alt klas\u00f6rleri listelemek veya bir a\u011fa\u00e7 veri yap\u0131s\u0131ndaki (tree data structure) t\u00fcm d\u00fc\u011f\u00fcmleri ziyaret etmek gibi g\u00f6revler, \u00f6zyineleme ile do\u011fal bir \u015fekilde ifade edilebilir. Bu yakla\u015f\u0131m, kodun daha k\u0131sa, okunabilir ve bak\u0131m\u0131 daha kolay olmas\u0131n\u0131 sa\u011flayabilir.<\/p>\n<p>\u00d6zyinelemeli bir fonksiyonun iki temel bile\u015feni vard\u0131r:<\/p>\n<ol>\n<li><strong>Temel Durum (Base Case):<\/strong> Fonksiyonun kendini \u00e7a\u011f\u0131rmay\u0131 durdurdu\u011fu ve do\u011frudan bir sonu\u00e7 d\u00f6nd\u00fcrd\u00fc\u011f\u00fc durumdur. Bu, \u00f6zyinelemenin sonsuz bir d\u00f6ng\u00fcye girmesini engeller ve bir &#8220;\u00e7\u0131k\u0131\u015f kap\u0131s\u0131&#8221; g\u00f6revi g\u00f6r\u00fcr. Temel durum olmadan, fonksiyon kendini sonsuza dek \u00e7a\u011f\u0131r\u0131r ve bu da program\u0131n \u00e7\u00f6kmesine neden olur.<\/li>\n<li><strong>\u00d6zyinelemeli Ad\u0131m (Recursive Step):<\/strong> Fonksiyonun problemi daha k\u00fc\u00e7\u00fck bir alt probleme indirgeyerek kendini \u00e7a\u011f\u0131rd\u0131\u011f\u0131 k\u0131s\u0131md\u0131r. Her \u00f6zyinelemeli \u00e7a\u011fr\u0131da, problem orijinaline g\u00f6re daha basit veya daha k\u00fc\u00e7\u00fck hale gelmelidir, b\u00f6ylece en sonunda temel duruma ula\u015f\u0131l\u0131r.<\/li>\n<\/ol>\n<p>Bu iki bile\u015fen, \u00f6zyinelemenin ba\u015far\u0131l\u0131 bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. \u00d6zyineleme, \u00f6zellikle matematiksel tan\u0131mlar\u0131 (\u00f6rne\u011fin fakt\u00f6riyel, Fibonacci serisi) veya hiyerar\u015fik veri yap\u0131lar\u0131n\u0131 (\u00f6rne\u011fin a\u011fa\u00e7lar, ba\u011flant\u0131l\u0131 listeler) i\u015flemek i\u00e7in \u00e7ok uygundur. Kodun daha deklaratif (ne yap\u0131laca\u011f\u0131n\u0131 tan\u0131mlayan) olmas\u0131n\u0131 sa\u011flar, yani \u00e7\u00f6z\u00fcm\u00fcn ad\u0131mlar\u0131ndan \u00e7ok, problemin do\u011fas\u0131na odaklanmaya yard\u0131mc\u0131 olur. Bu da karma\u015f\u0131k algoritmalar\u0131n daha anla\u015f\u0131l\u0131r bir \u015fekilde ifade edilmesine olanak tan\u0131r. Ancak, \u00f6zyinelemenin do\u011fru bir \u015fekilde tasarlanmas\u0131 ve y\u00f6netilmesi, \u00f6zellikle performans ve bellek kullan\u0131m\u0131 a\u00e7\u0131s\u0131ndan \u00f6nemlidir. Aksi takdirde, beklenmedik sorunlarla kar\u015f\u0131la\u015f\u0131labilir.<\/p>\n<h3>\u00d6zyinelemenin Kalbi: Temel Durum (Base Case) Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>\u00d6zyinelemeli fonksiyonlar\u0131n en kritik par\u00e7as\u0131, temel durum (base case) olarak adland\u0131rd\u0131\u011f\u0131m\u0131z &#8220;\u00e7\u0131k\u0131\u015f ko\u015fulu&#8221;dur. Temel durum, bir fonksiyonun kendini \u00e7a\u011f\u0131rmay\u0131 ne zaman durduraca\u011f\u0131n\u0131 ve do\u011frudan bir de\u011fer d\u00f6nd\u00fcrerek \u00f6zyineleme zincirini ne zaman sonland\u0131raca\u011f\u0131n\u0131 belirler. E\u011fer bir \u00f6zyinelemeli fonksiyonun temel durumu do\u011fru bir \u015fekilde tan\u0131mlanmazsa, fonksiyon kendini sonsuza dek \u00e7a\u011f\u0131r\u0131r, bu da program\u0131n &#8220;y\u0131\u011f\u0131n ta\u015fmas\u0131&#8221; (stack overflow) hatas\u0131 vererek \u00e7\u00f6kmesine neden olur. Dolay\u0131s\u0131yla, temel durum, \u00f6zyinelemenin adeta can simididir.<\/p>\n<p>Bir \u00f6rne\u011fi ele alal\u0131m: Fakt\u00f6riyel hesaplama. Bir say\u0131n\u0131n fakt\u00f6riyeli, o say\u0131dan 1&#8217;e kadar olan t\u00fcm tam say\u0131lar\u0131n \u00e7arp\u0131m\u0131d\u0131r (\u00f6rne\u011fin, 5! = 5 * 4 * 3 * 2 * 1). Matematiksel olarak, <code>n! = n * (n-1)!<\/code> \u015feklinde tan\u0131mlan\u0131r ve <code>0! = 1<\/code> olarak kabul edilir. \u0130\u015fte bu <code>0! = 1<\/code> k\u0131sm\u0131 bizim temel durumumuzdur.<\/p>\n<p>A\u015fa\u011f\u0131daki C++ kodu, fakt\u00f6riyel hesaplamay\u0131 \u00f6zyinelemeli bir \u015fekilde nas\u0131l yapabilece\u011fimizi g\u00f6steriyor:<\/p>\n<div class=\"code-container\">\n<pre><code>\nint faktoriyel(int n) {\n    \/\/ Temel Durum (Base Case): \u00d6zyinelemenin durma noktas\u0131\n    if (n == 0) {\n        return 1;\n    }\n    \/\/ \u00d6zyinelemeli Ad\u0131m (Recursive Step): Problemi daha k\u00fc\u00e7\u00fc\u011fe indirgeme\n    return n * faktoriyel(n - 1);\n}\n  <\/code><\/pre>\n<\/div>\n<p>Bu \u00f6rnekte, <code>faktoriyel(n)<\/code> fonksiyonu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda:<\/p>\n<ul>\n<li>E\u011fer <code>n<\/code> 0 ise (temel durum), fonksiyon do\u011frudan 1 d\u00f6nd\u00fcr\u00fcr ve ba\u015fka bir \u00e7a\u011fr\u0131 yapmaz.<\/li>\n<li>E\u011fer <code>n<\/code> 0 de\u011filse (\u00f6zyinelemeli ad\u0131m), fonksiyon <code>n<\/code> ile <code>faktoriyel(n - 1)<\/code> sonucunu \u00e7arparak kendini \u00e7a\u011f\u0131r\u0131r. Bu, problemi <code>n-1<\/code>&#8216;in fakt\u00f6riyelini bulmaya indirger.<\/li>\n<\/ul>\n<p>\u00d6rne\u011fin, <code>faktoriyel(3)<\/code> \u00e7a\u011fr\u0131s\u0131 \u015fu \u015fekilde ilerler:<\/p>\n<ol>\n<li><code>faktoriyel(3)<\/code> \u00e7a\u011fr\u0131l\u0131r. <code>n<\/code> 0 olmad\u0131\u011f\u0131 i\u00e7in <code>3 * faktoriyel(2)<\/code> hesaplan\u0131r.<\/li>\n<li><code>faktoriyel(2)<\/code> \u00e7a\u011fr\u0131l\u0131r. <code>n<\/code> 0 olmad\u0131\u011f\u0131 i\u00e7in <code>2 * faktoriyel(1)<\/code> hesaplan\u0131r.<\/li>\n<li><code>faktoriyel(1)<\/code> \u00e7a\u011fr\u0131l\u0131r. <code>n<\/code> 0 olmad\u0131\u011f\u0131 i\u00e7in <code>1 * faktoriyel(0)<\/code> hesaplan\u0131r.<\/li>\n<li><code>faktoriyel(0)<\/code> \u00e7a\u011fr\u0131l\u0131r. <code>n<\/code> 0 oldu\u011fu i\u00e7in temel duruma ula\u015f\u0131l\u0131r ve 1 d\u00f6nd\u00fcr\u00fcl\u00fcr.<\/li>\n<li><code>faktoriyel(1)<\/code>, <code>1 * 1<\/code> sonucunu hesaplar ve 1 d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>faktoriyel(2)<\/code>, <code>2 * 1<\/code> sonucunu hesaplar ve 2 d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>faktoriyel(3)<\/code>, <code>3 * 2<\/code> sonucunu hesaplar ve 6 d\u00f6nd\u00fcr\u00fcr.<\/li>\n<\/ol>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc gibi, her ad\u0131mda problem k\u00fc\u00e7\u00fclerek en sonunda temel duruma ula\u015f\u0131l\u0131yor ve sonu\u00e7lar geriye do\u011fru birle\u015ferek nihai cevab\u0131 olu\u015fturuyor. Temel durumun do\u011fru belirlenmesi, \u00f6zyinelemenin hem do\u011fru \u00e7al\u0131\u015fmas\u0131n\u0131 hem de sonlanmas\u0131n\u0131 garantiler. Temel durumun atlanmas\u0131 veya yanl\u0131\u015f tan\u0131mlanmas\u0131, program\u0131n kontrols\u00fcz bir \u015fekilde kendini \u00e7a\u011f\u0131rmas\u0131na ve bellek kaynaklar\u0131n\u0131 t\u00fcketerek \u00e7\u00f6kmesine yol a\u00e7ar. Bu nedenle, \u00f6zyinelemeli bir fonksiyon yazarken ilk d\u00fc\u015f\u00fcn\u00fclmesi gereken \u015fey, temel durumun ne olaca\u011f\u0131 ve nas\u0131l i\u015flenece\u011fidir.<\/p>\n<h3>\u00c7a\u011fr\u0131 Y\u0131\u011f\u0131n\u0131 (Call Stack) ve LIFO Prensibi: Fonksiyonlar Nas\u0131l Y\u00f6netilir?<\/h3>\n<p>\u00d6zyinelemenin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 tam olarak anlamak i\u00e7in, programlar\u0131n fonksiyon \u00e7a\u011fr\u0131lar\u0131n\u0131 nas\u0131l y\u00f6netti\u011fini bilmek hayati \u00f6nem ta\u015f\u0131r. \u0130\u015fte burada &#8220;\u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131&#8221; (call stack) ve onun i\u015fleyi\u015fini belirleyen &#8220;LIFO&#8221; (Last-In, First-Out &#8211; Son Giren \u0130lk \u00c7\u0131kar) prensibi devreye girer. \u00c7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131, program\u0131n\u0131zdaki aktif fonksiyon \u00e7a\u011fr\u0131lar\u0131n\u0131 takip eden \u00f6zel bir bellek alan\u0131d\u0131r. Her fonksiyon \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, o fonksiyona ait bilgiler (yerel de\u011fi\u015fkenler, parametreler, d\u00f6n\u00fc\u015f adresi gibi) \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131n\u0131n en \u00fcst\u00fcne &#8220;itilir&#8221; (push). Fonksiyon i\u015fini bitirip bir de\u011fer d\u00f6nd\u00fcrd\u00fc\u011f\u00fcnde, bu bilgiler y\u0131\u011f\u0131ndan &#8220;\u00e7ekilir&#8221; (pop).<\/p>\n<p>Bu mekanizma, bir kitap y\u0131\u011f\u0131n\u0131na benzer. Bir kitab\u0131 y\u0131\u011f\u0131n\u0131n en \u00fcst\u00fcne koyars\u0131n\u0131z (push), ve almak istedi\u011finizde de y\u0131\u011f\u0131n\u0131n en \u00fcst\u00fcndeki kitab\u0131 al\u0131rs\u0131n\u0131z (pop). En son eklenen kitap, her zaman ilk al\u0131nabilen kitapt\u0131r. Bu davran\u0131\u015fa LIFO prensibi denir.<\/p>\n<p>\u00d6zyinelemeli bir fonksiyon \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda, ayn\u0131 LIFO prensibi uygulan\u0131r. Her \u00f6zyinelemeli \u00e7a\u011fr\u0131, y\u0131\u011f\u0131na yeni bir &#8220;y\u0131\u011f\u0131n \u00e7er\u00e7evesi&#8221; (stack frame) ekler. Bu \u00e7er\u00e7eve, o spesifik fonksiyon \u00e7a\u011fr\u0131s\u0131n\u0131n durumunu (parametre de\u011ferleri, yerel de\u011fi\u015fkenler vb.) i\u00e7erir. \u00d6zyineleme temel duruma ula\u015f\u0131p bir de\u011fer d\u00f6nd\u00fcrmeye ba\u015flad\u0131\u011f\u0131nda, en son eklenen y\u0131\u011f\u0131n \u00e7er\u00e7evesi y\u0131\u011f\u0131ndan \u00e7\u0131kar\u0131l\u0131r ve kontrol, bir \u00f6nceki \u00e7a\u011fr\u0131ya geri d\u00f6ner. Bu s\u00fcre\u00e7, t\u00fcm \u00f6zyinelemeli \u00e7a\u011fr\u0131lar tamamlanana ve orijinal \u00e7a\u011fr\u0131ya d\u00f6n\u00fclene kadar devam eder.<\/p>\n<p>Fakt\u00f6riyel \u00f6rne\u011fimizdeki <code>faktoriyel(3)<\/code> \u00e7a\u011fr\u0131s\u0131n\u0131n \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131 \u00fczerindeki etkisini ad\u0131m ad\u0131m inceleyelim:<\/p>\n<ol>\n<li><code>main()<\/code> fonksiyonundan <code>faktoriyel(3)<\/code> \u00e7a\u011fr\u0131l\u0131r. <code>main<\/code>&#8216;in \u00e7er\u00e7evesi y\u0131\u011f\u0131nda, ard\u0131ndan <code>faktoriyel(3)<\/code>&#8216;\u00fcn \u00e7er\u00e7evesi y\u0131\u011f\u0131na itilir.<\/li>\n<li><code>faktoriyel(3)<\/code> i\u00e7inde <code>faktoriyel(2)<\/code> \u00e7a\u011fr\u0131l\u0131r. <code>faktoriyel(2)<\/code>&#8216;nin \u00e7er\u00e7evesi y\u0131\u011f\u0131na itilir.<\/li>\n<li><code>faktoriyel(2)<\/code> i\u00e7inde <code>faktoriyel(1)<\/code> \u00e7a\u011fr\u0131l\u0131r. <code>faktoriyel(1)<\/code>&#8216;in \u00e7er\u00e7evesi y\u0131\u011f\u0131na itilir.<\/li>\n<li><code>faktoriyel(1)<\/code> i\u00e7inde <code>faktoriyel(0)<\/code> \u00e7a\u011fr\u0131l\u0131r. <code>faktoriyel(0)<\/code>&#8216;\u0131n \u00e7er\u00e7evesi y\u0131\u011f\u0131na itilir.<\/li>\n<li><code>faktoriyel(0)<\/code> temel duruma ula\u015f\u0131r ve 1 d\u00f6nd\u00fcr\u00fcr. Bu \u00e7er\u00e7eve y\u0131\u011f\u0131ndan \u00e7ekilir.<\/li>\n<li>Kontrol <code>faktoriyel(1)<\/code>&#8216;e d\u00f6ner. Geri d\u00f6nen 1 de\u011ferini kullanarak kendi hesaplamas\u0131n\u0131 (<code>1 * 1<\/code>) tamamlar ve 1 d\u00f6nd\u00fcr\u00fcr. Bu \u00e7er\u00e7eve y\u0131\u011f\u0131ndan \u00e7ekilir.<\/li>\n<li>Kontrol <code>faktoriyel(2)<\/code>&#8216;ye d\u00f6ner. Geri d\u00f6nen 1 de\u011ferini kullanarak kendi hesaplamas\u0131n\u0131 (<code>2 * 1<\/code>) tamamlar ve 2 d\u00f6nd\u00fcr\u00fcr. Bu \u00e7er\u00e7eve y\u0131\u011f\u0131ndan \u00e7ekilir.<\/li>\n<li>Kontrol <code>faktoriyel(3)<\/code>&#8216;e d\u00f6ner. Geri d\u00f6nen 2 de\u011ferini kullanarak kendi hesaplamas\u0131n\u0131 (<code>3 * 2<\/code>) tamamlar ve 6 d\u00f6nd\u00fcr\u00fcr. Bu \u00e7er\u00e7eve y\u0131\u011f\u0131ndan \u00e7ekilir.<\/li>\n<li>Son olarak, kontrol <code>main()<\/code> fonksiyonuna d\u00f6ner ve <code>main<\/code>&#8216;in \u00e7er\u00e7evesi de y\u0131\u011f\u0131ndan \u00e7ekilebilir.<\/li>\n<\/ol>\n<p>Bu s\u00fcre\u00e7, \u00f6zyinelemeli \u00e7a\u011fr\u0131lar\u0131n nas\u0131l biriktirildi\u011fini ve temel duruma ula\u015f\u0131ld\u0131\u011f\u0131nda nas\u0131l s\u0131ras\u0131yla \u00e7\u00f6z\u00fclerek y\u0131\u011f\u0131ndan \u00e7\u0131kar\u0131ld\u0131\u011f\u0131n\u0131 a\u00e7\u0131k\u00e7a g\u00f6sterir. Her bir \u00e7a\u011fr\u0131, kendi durumunu y\u0131\u011f\u0131nda saklar ve bu sayede program, hangi noktadan devam edece\u011fini bilir. Ancak, \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131n\u0131n boyutu s\u0131n\u0131rl\u0131d\u0131r. \u00c7ok fazla \u00f6zyinelemeli \u00e7a\u011fr\u0131 yap\u0131ld\u0131\u011f\u0131nda ve temel duruma ula\u015f\u0131lamad\u0131\u011f\u0131nda, y\u0131\u011f\u0131n belle\u011fi t\u00fckenir ve bu da &#8220;y\u0131\u011f\u0131n ta\u015fmas\u0131&#8221; hatas\u0131na yol a\u00e7ar. Bu nedenle, \u00f6zyineleme kullan\u0131rken temel durumu do\u011fru belirlemek ve \u00f6zyineleme derinli\u011fini kontrol alt\u0131nda tutmak kritik \u00f6neme sahiptir.<\/p>\n<h3>Y\u0131\u011f\u0131n Ta\u015fmas\u0131 (Stack Overflow): \u00d6zyinelemenin Karanl\u0131k Y\u00fcz\u00fc ve \u00d6nlemleri<\/h3>\n<p>\u00d6zyineleme, zarif ve g\u00fc\u00e7l\u00fc bir \u00e7\u00f6z\u00fcm tekni\u011fi olsa da, yanl\u0131\u015f kullan\u0131ld\u0131\u011f\u0131nda veya kontrols\u00fcz b\u0131rak\u0131ld\u0131\u011f\u0131nda ciddi sorunlara yol a\u00e7abilir. Bu sorunlar\u0131n en bilineni ve en tehlikelisi, &#8220;y\u0131\u011f\u0131n ta\u015fmas\u0131&#8221; (stack overflow) hatas\u0131d\u0131r. Y\u0131\u011f\u0131n ta\u015fmas\u0131, program\u0131n \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131n\u0131n (call stack) ayr\u0131lan bellek alan\u0131n\u0131 a\u015fmas\u0131 durumunda meydana gelir. Her fonksiyon \u00e7a\u011fr\u0131s\u0131, y\u0131\u011f\u0131nda belirli bir miktar bellek (y\u0131\u011f\u0131n \u00e7er\u00e7evesi) kullan\u0131r. E\u011fer bir fonksiyon kendini \u00e7ok fazla kez \u00e7a\u011f\u0131r\u0131r ve temel duruma ula\u015farak \u00f6zyinelemeyi sonland\u0131ramazsa, \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131 s\u00fcrekli b\u00fcy\u00fcr ve sonunda tahsis edilen bellek limitini a\u015far. Bu durum, program\u0131n aniden ve genellikle bir hata mesaj\u0131yla birlikte \u00e7\u00f6kmesine neden olur.<\/p>\n<p>Y\u0131\u011f\u0131n ta\u015fmas\u0131n\u0131n ba\u015fl\u0131ca nedenleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Eksik veya Yanl\u0131\u015f Temel Durum:<\/strong> En yayg\u0131n nedendir. E\u011fer \u00f6zyinelemeli bir fonksiyonda temel durum tan\u0131mlanmam\u0131\u015fsa veya hi\u00e7bir zaman ula\u015f\u0131lamayacak bir ko\u015fula ba\u011fl\u0131ysa, fonksiyon kendini sonsuza kadar \u00e7a\u011f\u0131r\u0131r.<\/li>\n<li><strong>\u00c7ok Derin \u00d6zyineleme:<\/strong> Problem boyutu \u00e7ok b\u00fcy\u00fck oldu\u011funda, temel duruma ula\u015fmak i\u00e7in \u00e7ok say\u0131da \u00f6zyinelemeli \u00e7a\u011fr\u0131 gerekebilir. \u00c7a\u011fr\u0131 say\u0131s\u0131, i\u015fletim sistemi veya derleyici taraf\u0131ndan belirlenen y\u0131\u011f\u0131n boyutu limitini a\u015farsa, y\u0131\u011f\u0131n ta\u015fmas\u0131 meydana gelir. \u00d6rne\u011fin, 100.000 elemanl\u0131 bir dizide \u00f6zyinelemeli bir arama yapmaya \u00e7al\u0131\u015fmak bu t\u00fcr bir soruna yol a\u00e7abilir.<\/li>\n<li><strong>Bellek Yo\u011fun Y\u0131\u011f\u0131n \u00c7er\u00e7eveleri:<\/strong> Her fonksiyon \u00e7a\u011fr\u0131s\u0131n\u0131n y\u0131\u011f\u0131na itti\u011fi y\u0131\u011f\u0131n \u00e7er\u00e7evesi, fonksiyonun yerel de\u011fi\u015fkenleri ve parametreleri i\u00e7in bellek kullan\u0131r. E\u011fer bu de\u011fi\u015fkenler \u00e7ok b\u00fcy\u00fckse (\u00f6rne\u011fin, b\u00fcy\u00fck diziler veya yap\u0131lar), y\u0131\u011f\u0131n daha h\u0131zl\u0131 dolar.<\/li>\n<\/ul>\n<p>Peki, y\u0131\u011f\u0131n ta\u015fmas\u0131n\u0131 nas\u0131l \u00f6nleyebiliriz? \u0130\u015fte baz\u0131 etkili stratejiler:<\/p>\n<ol>\n<li><strong>Do\u011fru ve Eri\u015filebilir Temel Durum:<\/strong> Her \u00f6zyinelemeli fonksiyonda mutlaka bir temel durum tan\u0131mlay\u0131n ve bu temel durumun her zaman ula\u015f\u0131labilir oldu\u011fundan emin olun. Problemin en basit hali nedir ve bu durumda fonksiyon ne d\u00f6nd\u00fcrmeli? Bu sorular\u0131n cevaplar\u0131, temel durumu do\u011fru belirlemenize yard\u0131mc\u0131 olur.<\/li>\n<li><strong>Problem Boyutunu Kontrol Edin:<\/strong> \u00d6zyinelemeli \u00e7\u00f6z\u00fcmlerin problem boyutuna g\u00f6re ne kadar derinle\u015fece\u011fini iyi anlay\u0131n. E\u011fer \u00f6zyineleme derinli\u011fi \u00e7ok b\u00fcy\u00fck olma potansiyeline sahipse (\u00f6rne\u011fin, N de\u011feri \u00e7ok b\u00fcy\u00fck olabilecekse), alternatif yinelemeli (iterative) \u00e7\u00f6z\u00fcmleri d\u00fc\u015f\u00fcnmek daha iyi olabilir.<\/li>\n<li><strong>Yinelemeli \u00c7\u00f6z\u00fcmlere Ge\u00e7i\u015f:<\/strong> Bir\u00e7ok \u00f6zyinelemeli problem, e\u015fde\u011fer yinelemeli (d\u00f6ng\u00fcler kullanan) bir \u00e7\u00f6z\u00fcmle de \u00e7\u00f6z\u00fclebilir. Yinelemeli \u00e7\u00f6z\u00fcmler genellikle \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131 kullanmad\u0131klar\u0131 i\u00e7in y\u0131\u011f\u0131n ta\u015fmas\u0131 riskini ta\u015f\u0131mazlar ve bellek kullan\u0131m\u0131 a\u00e7\u0131s\u0131ndan daha verimli olabilirler.<\/li>\n<li><strong>Kuyruk \u00d6zyinelemesi (Tail Recursion) Optimizasyonu:<\/strong> Baz\u0131 derleyiciler, kuyruk \u00f6zyinelemesi ad\u0131 verilen \u00f6zel bir \u00f6zyineleme t\u00fcr\u00fcn\u00fc optimize edebilir. Kuyruk \u00f6zyinelemesinde, \u00f6zyinelemeli \u00e7a\u011fr\u0131, fonksiyonun yapt\u0131\u011f\u0131 son i\u015flemdir. Bu durumda, derleyici yeni bir y\u0131\u011f\u0131n \u00e7er\u00e7evesi olu\u015fturmak yerine mevcut y\u0131\u011f\u0131n \u00e7er\u00e7evesini yeniden kullanabilir, b\u00f6ylece y\u0131\u011f\u0131n b\u00fcy\u00fcmesini engeller. Ancak bu optimizasyon her dilde ve her derleyicide desteklenmez (C++ standard\u0131 bunu garanti etmez, ancak baz\u0131 derleyiciler yapar).<\/li>\n<li><strong>Y\u0131\u011f\u0131n Boyutunu Art\u0131rma (Ge\u00e7ici \u00c7\u00f6z\u00fcm):<\/strong> Nadiren de olsa, baz\u0131 sistemlerde y\u0131\u011f\u0131n boyutunu manuel olarak art\u0131rmak m\u00fcmk\u00fcn olabilir. Ancak bu genellikle bir semptomu tedavi etmekten \u00f6teye ge\u00e7mez ve temel sorunu \u00e7\u00f6zmez. Genellikle daha iyi bir algoritma veya yinelemeli bir yakla\u015f\u0131ma ge\u00e7mek daha kal\u0131c\u0131 bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/li>\n<\/ol>\n<p>Y\u0131\u011f\u0131n ta\u015fmas\u0131, \u00f6zellikle yeni ba\u015flayanlar i\u00e7in \u00f6zyineleme kullan\u0131rken kar\u015f\u0131la\u015f\u0131lan yayg\u0131n bir hatad\u0131r. Bu nedenle, \u00f6zyinelemeli bir fonksiyon tasarlarken her zaman temel durumu ve \u00f6zyineleme derinli\u011fini g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir. Kontroll\u00fc ve d\u00fc\u015f\u00fcn\u00fclm\u00fc\u015f \u00f6zyineleme, kodunuzu daha zarif ve okunabilir hale getirebilirken, kontrols\u00fcz \u00f6zyineleme program\u0131n\u0131z i\u00e7in bir felakete d\u00f6n\u00fc\u015febilir.<\/p>\n<h3>\u00d6zyineleme mi, Yineleme mi? Karar Verme Sanat\u0131<\/h3>\n<p>Programlama d\u00fcnyas\u0131nda bir\u00e7ok problem hem \u00f6zyinelemeli (recursive) hem de yinelemeli (iterative) yakla\u015f\u0131mlarla \u00e7\u00f6z\u00fclebilir. \u00d6zyineleme, bir fonksiyonun kendi kendini \u00e7a\u011f\u0131rmas\u0131 prensibine dayan\u0131rken, yineleme <code>for<\/code> veya <code>while<\/code> gibi d\u00f6ng\u00fcler kullanarak ayn\u0131 i\u015flemi tekrar tekrar ger\u00e7ekle\u015ftirmeyi i\u00e7erir. Her iki yakla\u015f\u0131m\u0131n da kendine \u00f6zg\u00fc avantajlar\u0131 ve dezavantajlar\u0131 vard\u0131r ve do\u011fru se\u00e7imi yapmak, projenin gereksinimlerine, performans beklentilerine ve kodun okunabilirli\u011fine ba\u011fl\u0131d\u0131r.<\/p>\n<p><strong>\u00d6zyinelemenin Avantajlar\u0131:<\/strong><\/p>\n<ul>\n<li><strong>Zarafet ve Okunabilirlik:<\/strong> Baz\u0131 problemler, \u00f6zellikle matematiksel tan\u0131mlar\u0131 veya do\u011fal olarak \u00f6zyinelemeli veri yap\u0131lar\u0131n\u0131 (a\u011fa\u00e7lar, graflar gibi) i\u00e7erenler, \u00f6zyineleme ile \u00e7ok daha do\u011fal ve zarif bir \u015fekilde ifade edilebilir. Kod, problemin tan\u0131m\u0131na daha yak\u0131n olabilir. \u00d6rne\u011fin, Fibonacci serisi veya bir dizinin s\u0131ralanmas\u0131 (QuickSort, MergeSort) gibi algoritmalar \u00f6zyinelemeli olarak yaz\u0131ld\u0131\u011f\u0131nda olduk\u00e7a anla\u015f\u0131l\u0131r olabilir.<\/li>\n<li><strong>Daha Az Kod:<\/strong> Bazen \u00f6zyinelemeli \u00e7\u00f6z\u00fcmler, e\u015fde\u011fer yinelemeli \u00e7\u00f6z\u00fcmlerden daha az kod sat\u0131r\u0131 gerektirebilir. Bu, \u00f6zellikle karma\u015f\u0131k veri yap\u0131lar\u0131n\u0131 i\u015flerken ge\u00e7erli olabilir.<\/li>\n<li><strong>Do\u011fal Uyum:<\/strong> A\u011fa\u00e7 ge\u00e7i\u015fleri (tree traversals), dosya sistemi taramalar\u0131 gibi hiyerar\u015fik veya i\u00e7 i\u00e7e ge\u00e7mi\u015f yap\u0131lar\u0131 i\u015fleyen algoritmalar i\u00e7in \u00f6zyineleme, problemin yap\u0131s\u0131na do\u011fal olarak uyar.<\/li>\n<\/ul>\n<p><strong>\u00d6zyinelemenin Dezavantajlar\u0131:<\/strong><\/p>\n<ul>\n<li><strong>Performans Maliyeti:<\/strong> Her fonksiyon \u00e7a\u011fr\u0131s\u0131, \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131nda yeni bir y\u0131\u011f\u0131n \u00e7er\u00e7evesi olu\u015fturur. Bu i\u015flem, d\u00f6ng\u00fc kontrol mekanizmalar\u0131na g\u00f6re daha fazla i\u015flemci s\u00fcresi ve bellek gerektirir. K\u00fc\u00e7\u00fck problemler i\u00e7in bu fark \u00f6nemsiz olsa da, \u00e7ok derin \u00f6zyinelemelerde performans d\u00fc\u015f\u00fc\u015f\u00fc g\u00f6zlemlenebilir.<\/li>\n<li><strong>Y\u0131\u011f\u0131n Ta\u015fmas\u0131 Riski:<\/strong> Daha \u00f6nce de bahsedildi\u011fi gibi, temel duruma ula\u015f\u0131lamamas\u0131 veya \u00e7ok derin \u00f6zyineleme, \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131n\u0131n belle\u011fini t\u00fcketerek y\u0131\u011f\u0131n ta\u015fmas\u0131 hatas\u0131na yol a\u00e7abilir.<\/li>\n<li><strong>Hata Ay\u0131klama Zorlu\u011fu:<\/strong> \u00c7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131ndaki \u00e7ok say\u0131da i\u00e7 i\u00e7e ge\u00e7mi\u015f \u00e7a\u011fr\u0131 nedeniyle, \u00f6zyinelemeli fonksiyonlardaki hatalar\u0131 ay\u0131klamak (debugging) bazen daha zor olabilir.<\/li>\n<\/ul>\n<p><strong>Yinelemenin Avantajlar\u0131:<\/strong><\/p>\n<ul>\n<li><strong>Performans ve Bellek Verimlili\u011fi:<\/strong> D\u00f6ng\u00fcler, fonksiyon \u00e7a\u011fr\u0131lar\u0131n\u0131n getirdi\u011fi ek y\u00fckten ka\u00e7\u0131nd\u0131\u011f\u0131 i\u00e7in genellikle \u00f6zyinelemeden daha h\u0131zl\u0131 ve daha az bellek t\u00fcketir. Y\u0131\u011f\u0131n ta\u015fmas\u0131 riski ta\u015f\u0131mazlar.<\/li>\n<li><strong>Kontrol Edilebilirlik:<\/strong> D\u00f6ng\u00fclerin ak\u0131\u015f\u0131n\u0131 ve durumunu y\u00f6netmek genellikle daha kolayd\u0131r. Program\u0131n hangi a\u015famada oldu\u011funu takip etmek daha basittir.<\/li>\n<li><strong>Daha Az Risk:<\/strong> Y\u0131\u011f\u0131n ta\u015fmas\u0131 gibi beklenmedik hatalarla kar\u015f\u0131la\u015fma olas\u0131l\u0131\u011f\u0131 daha d\u00fc\u015f\u00fckt\u00fcr.<\/li>\n<\/ul>\n<p><strong>Yinelemenin Dezavantajlar\u0131:<\/strong><\/p>\n<ul>\n<li><strong>Karma\u015f\u0131kl\u0131k:<\/strong> Baz\u0131 problemler i\u00e7in yinelemeli bir \u00e7\u00f6z\u00fcm yazmak, \u00f6zyinelemeli kar\u015f\u0131l\u0131\u011f\u0131ndan daha karma\u015f\u0131k ve daha az sezgisel olabilir. \u00d6zellikle \u00f6zyinelemeli bir yap\u0131s\u0131 olan problemlerde, durumu manuel olarak y\u00f6netmek i\u00e7in ek veri yap\u0131lar\u0131 (\u00f6rne\u011fin, kendi y\u0131\u011f\u0131n\u0131n\u0131z\u0131 veya kuyru\u011funuzu) kullanman\u0131z gerekebilir.<\/li>\n<li><strong>Okunabilirlik:<\/strong> Baz\u0131 durumlarda, yinelemeli kod \u00f6zyinelemeli koda g\u00f6re daha az okunabilir veya anla\u015f\u0131l\u0131r olabilir.<\/li>\n<\/ul>\n<p><strong>Ne Zaman Hangisini Se\u00e7meli?<\/strong><\/p>\n<p>Bu karar, problemin do\u011fas\u0131na ve beklentilerinize g\u00f6re de\u011fi\u015fir:<\/p>\n<ul>\n<li><strong>Do\u011fal \u00d6zyinelemeli Problemler:<\/strong> A\u011fa\u00e7 ve grafik ge\u00e7i\u015fleri, Quicksort\/Mergesort gibi b\u00f6l ve y\u00f6net (divide and conquer) algoritmalar\u0131, matematiksel tan\u0131mlar (fakt\u00f6riyel, Fibonacci) gibi problemler i\u00e7in \u00f6zyineleme genellikle daha do\u011fal ve okunabilir bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/li>\n<li><strong>Performans Kritik Uygulamalar:<\/strong> E\u011fer bellek veya i\u015flemci performans\u0131 kritikse ve \u00f6zyineleme derinli\u011fi \u00e7ok y\u00fcksek olma potansiyeline sahipse, yinelemeli bir \u00e7\u00f6z\u00fcm tercih edilmelidir.<\/li>\n<li><strong>S\u0131n\u0131rl\u0131 Y\u0131\u011f\u0131n Boyutu:<\/strong> G\u00f6m\u00fcl\u00fc sistemler veya belirli platformlar gibi s\u0131n\u0131rl\u0131 y\u0131\u011f\u0131n belle\u011fi olan ortamlarda yineleme genellikle daha g\u00fcvenli bir se\u00e7enektir.<\/li>\n<li><strong>Okunabilirlik ve Bak\u0131m:<\/strong> E\u011fer \u00f6zyinelemeli \u00e7\u00f6z\u00fcm \u00e7ok daha temiz ve anla\u015f\u0131l\u0131rsa ve performans bir sorun te\u015fkil etmiyorsa, \u00f6zyinelemeyi tercih edebilirsiniz. Ancak, \u00e7ok karma\u015f\u0131k bir \u00f6zyinelemeli \u00e7\u00f6z\u00fcm\u00fc basitle\u015ftirmek zorsa, yinelemeli bir yakla\u015f\u0131m daha iyi olabilir.<\/li>\n<\/ul>\n<p>Sonu\u00e7 olarak, \u00f6zyineleme ve yineleme aras\u0131nda kesin bir &#8220;en iyi&#8221; se\u00e7enek yoktur. Her ikisi de programc\u0131n\u0131n ara\u00e7 kutusunda bulunmas\u0131 gereken de\u011ferli ara\u00e7lard\u0131r. \u00d6nemli olan, kar\u015f\u0131la\u015f\u0131lan probleme en uygun, en verimli ve en okunabilir \u00e7\u00f6z\u00fcm\u00fc sunacak yakla\u015f\u0131m\u0131 bilin\u00e7li bir \u015fekilde se\u00e7ebilmektir.<\/p>\n<h3>Ger\u00e7ek D\u00fcnya Senaryolar\u0131nda \u00d6zyineleme: G\u00fc\u00e7l\u00fc Kullan\u0131m Alanlar\u0131<\/h3>\n<p>\u00d6zyineleme, sadece teorik bir kavram veya basit matematiksel problemlerin \u00e7\u00f6z\u00fcm\u00fc i\u00e7in kullan\u0131lan bir teknik de\u011fildir. Bilgisayar bilimlerinde ve yaz\u0131l\u0131m geli\u015ftirmede bir\u00e7ok ger\u00e7ek d\u00fcnya senaryosunda g\u00fc\u00e7l\u00fc ve zarif \u00e7\u00f6z\u00fcmler sunar. \u00d6zyinelemenin do\u011fal olarak parlad\u0131\u011f\u0131 baz\u0131 alanlara g\u00f6z atal\u0131m:<\/p>\n<ol>\n<li>\n<h4>Dosya Sistemi Taramas\u0131<\/h4>\n<p>        Bilgisayar\u0131n\u0131zdaki dosya sistemleri, i\u00e7 i\u00e7e ge\u00e7mi\u015f klas\u00f6rlerden (dizinlerden) olu\u015fan hiyerar\u015fik bir yap\u0131d\u0131r. Bir klas\u00f6r\u00fcn i\u00e7inde hem dosyalar hem de ba\u015fka klas\u00f6rler bulunabilir. Bir program\u0131n belirli bir klas\u00f6rden ba\u015flayarak t\u00fcm alt klas\u00f6rleri ve dosyalar\u0131 bulmas\u0131, silmesi veya listelemesi gerekti\u011finde \u00f6zyineleme m\u00fckemmel bir \u00e7\u00f6z\u00fcmd\u00fcr.<\/p>\n<p><strong>Vaka Analizi:<\/strong> Bir yedekleme yaz\u0131l\u0131m\u0131 geli\u015ftiriyorsunuz. Kullan\u0131c\u0131n\u0131n se\u00e7ti\u011fi bir klas\u00f6rdeki t\u00fcm dosyalar\u0131 (alt klas\u00f6rlerdekiler dahil) yedeklemeniz gerekiyor. Bunu \u00f6zyinelemeli olarak \u015fu \u015fekilde d\u00fc\u015f\u00fcnebiliriz:<\/p>\n<ul>\n<li>Bir klas\u00f6r\u00fc al.<\/li>\n<li>\u0130\u00e7indeki t\u00fcm dosyalar\u0131 yedekle.<\/li>\n<li>\u0130\u00e7indeki her alt klas\u00f6r i\u00e7in, ayn\u0131 yedekleme fonksiyonunu tekrar \u00e7a\u011f\u0131r.<\/li>\n<li>Temel durum: E\u011fer bir klas\u00f6rde hi\u00e7 alt klas\u00f6r yoksa, sadece i\u00e7indeki dosyalar\u0131 yedekle ve dur.<\/li>\n<\/ul>\n<p>        Bu yakla\u015f\u0131m, dosya sisteminin do\u011fal hiyerar\u015fisini do\u011frudan yans\u0131t\u0131r ve kodun okunabilirli\u011fini art\u0131r\u0131r.\n    <\/li>\n<li>\n<h4>A\u011fa\u00e7 ve Grafik Veri Yap\u0131lar\u0131 (Tree and Graph Data Structures)<\/h4>\n<p>        Bilgisayar bilimlerindeki bir\u00e7ok \u00f6nemli veri yap\u0131s\u0131 a\u011fa\u00e7 veya grafik formundad\u0131r. Bir organizasyon \u015femas\u0131, bir internet sitesinin ba\u011flant\u0131 yap\u0131s\u0131, bir sosyal a\u011fdaki arkada\u015fl\u0131k ili\u015fkileri, bir yapay zeka oyununda olas\u0131 hamleler, hepsi a\u011fa\u00e7 veya grafik olarak modellenebilir. Bu yap\u0131larda d\u00fc\u011f\u00fcmleri (node) ziyaret etmek, arama yapmak veya yollar\u0131 bulmak i\u00e7in \u00f6zyineleme \u00e7ok s\u0131k kullan\u0131l\u0131r.<\/p>\n<p><strong>Vaka Analizi:<\/strong> Bir web sitesinin t\u00fcm sayfalar\u0131n\u0131 tarayan bir \u00f6r\u00fcmcek (web crawler) yaz\u0131yorsunuz. Ba\u015flang\u0131\u00e7 sayfas\u0131ndan ba\u015flayarak, sitedeki t\u00fcm ba\u011flant\u0131lar\u0131 takip edip her sayfay\u0131 ziyaret etmeniz gerekiyor. Bu, bir grafikteki t\u00fcm d\u00fc\u011f\u00fcmleri gezmeye benzer:<\/p>\n<ul>\n<li>Bir sayfay\u0131 ziyaret et.<\/li>\n<li>Bu sayfadaki t\u00fcm ba\u011flant\u0131lar\u0131 bul.<\/li>\n<li>Her bir yeni ba\u011flant\u0131 i\u00e7in, (e\u011fer daha \u00f6nce ziyaret edilmediyse) ayn\u0131 ziyaret fonksiyonunu tekrar \u00e7a\u011f\u0131r.<\/li>\n<li>Temel durum: E\u011fer bir sayfa daha \u00f6nce ziyaret edildiyse veya hi\u00e7 yeni ba\u011flant\u0131 yoksa, dur.<\/li>\n<\/ul>\n<p>        Bu sayede, sitenin derinliklerine inilerek t\u00fcm i\u00e7erik ke\u015ffedilebilir.\n    <\/li>\n<li>\n<h4>S\u0131ralama Algoritmalar\u0131 (Sorting Algorithms)<\/h4>\n<p>        QuickSort ve MergeSort gibi pop\u00fcler ve verimli s\u0131ralama algoritmalar\u0131, &#8220;b\u00f6l ve y\u00f6net&#8221; (divide and conquer) stratejisini kullan\u0131r ve bu da onlar\u0131 do\u011fal olarak \u00f6zyinelemeli yapar.<\/p>\n<p><strong>Vaka Analizi:<\/strong> \u00c7ok b\u00fcy\u00fck bir veri k\u00fcmesini (\u00f6rne\u011fin, bir milyon m\u00fc\u015fterinin sipari\u015f listesini) en h\u0131zl\u0131 \u015fekilde s\u0131ralaman\u0131z gerekiyor. QuickSort algoritmas\u0131 \u015fu mant\u0131kla \u00e7al\u0131\u015f\u0131r:<\/p>\n<ul>\n<li>Bir pivot eleman\u0131 se\u00e7.<\/li>\n<li>Diziyi, pivotun solunda ondan k\u00fc\u00e7\u00fck elemanlar, sa\u011f\u0131nda ondan b\u00fcy\u00fck elemanlar olacak \u015fekilde ikiye b\u00f6l.<\/li>\n<li>Pivotun solundaki alt dizi i\u00e7in QuickSort&#8217;u tekrar \u00e7a\u011f\u0131r.<\/li>\n<li>Pivotun sa\u011f\u0131ndaki alt dizi i\u00e7in QuickSort&#8217;u tekrar \u00e7a\u011f\u0131r.<\/li>\n<li>Temel durum: E\u011fer alt dizinin boyutu 0 veya 1 ise, zaten s\u0131ral\u0131d\u0131r, hi\u00e7bir \u015fey yapma.<\/li>\n<\/ul>\n<p>        Bu \u00f6zyinelemeli yakla\u015f\u0131m, b\u00fcy\u00fck veri k\u00fcmelerini paralel olarak veya \u00e7ok h\u0131zl\u0131 bir \u015fekilde s\u0131ralamak i\u00e7in olduk\u00e7a etkilidir.\n    <\/li>\n<li>\n<h4>Matematiksel Hesaplamalar ve Kombinatorik<\/h4>\n<p>        Fakt\u00f6riyel, Fibonacci serisi, \u00fcs alma gibi bir\u00e7ok matematiksel fonksiyonun tan\u0131m\u0131 \u00f6zyinelemelidir. Ayr\u0131ca perm\u00fctasyon (s\u0131ralama) ve kombinasyon (se\u00e7im) hesaplamalar\u0131 gibi kombinatorik problemler de \u00f6zyineleme ile zarif\u00e7e \u00e7\u00f6z\u00fclebilir.<\/p>\n<p><strong>Vaka Analizi:<\/strong> Bir banka uygulamas\u0131nda, belirli bir miktardaki paray\u0131 farkl\u0131 banknotlarla ka\u00e7 farkl\u0131 \u015fekilde \u00f6deyebilece\u011finizi hesaplaman\u0131z gerekiyor. Bu bir &#8220;para \u00fcst\u00fc problemi&#8221; (change-making problem) varyant\u0131d\u0131r ve \u00f6zyineleme ile \u00e7\u00f6z\u00fclebilir.<\/p>\n<ul>\n<li>Kalan miktar\u0131 ve kullan\u0131labilecek banknotlar\u0131 al.<\/li>\n<li>E\u011fer kalan miktar 0 ise, bir \u00e7\u00f6z\u00fcm buldun.<\/li>\n<li>E\u011fer kalan miktar negatifse veya hi\u00e7 banknot kalmad\u0131ysa, bu bir \u00e7\u00f6z\u00fcm de\u011fil.<\/li>\n<li>Aksi takdirde, bir banknotu kullanmay\u0131 dene ve kalan miktarla ayn\u0131 fonksiyonu tekrar \u00e7a\u011f\u0131r; veya o banknotu kullanmadan kalan banknotlarla ayn\u0131 fonksiyonu tekrar \u00e7a\u011f\u0131r.<\/li>\n<\/ul>\n<p>        Bu t\u00fcr problemler, \u00f6zyinelemenin farkl\u0131 olas\u0131l\u0131klar\u0131 ke\u015ffetme yetene\u011fini g\u00f6sterir.\n    <\/li>\n<\/ol>\n<p>Bu \u00f6rnekler, \u00f6zyinelemenin sadece akademik bir merak olmad\u0131\u011f\u0131n\u0131, ayn\u0131 zamanda g\u00fcnl\u00fck yaz\u0131l\u0131m geli\u015ftirme g\u00f6revlerinde kar\u015f\u0131la\u015f\u0131lan karma\u015f\u0131k problemleri \u00e7\u00f6zmek i\u00e7in pratik ve etkili bir ara\u00e7 oldu\u011funu a\u00e7\u0131k\u00e7a g\u00f6stermektedir. Do\u011fru kullan\u0131ld\u0131\u011f\u0131nda, kodun okunabilirli\u011fini art\u0131r\u0131r, karma\u015f\u0131k algoritmalar\u0131 basitle\u015ftirir ve zarif \u00e7\u00f6z\u00fcmler sunar.<\/p>\n<h3>\u00d6zyinelemeli \u00c7\u00f6z\u00fcmleri Optimize Etme \u0130pu\u00e7lar\u0131<\/h3>\n<p>\u00d6zyineleme, baz\u0131 durumlarda zarif ve anla\u015f\u0131l\u0131r \u00e7\u00f6z\u00fcmler sunsa da, performans ve bellek kullan\u0131m\u0131 a\u00e7\u0131s\u0131ndan dezavantajlar\u0131 olabilir. Ancak, \u00f6zyinelemeli fonksiyonlar\u0131n\u0131z\u0131 daha verimli hale getirmek i\u00e7in uygulayabilece\u011finiz baz\u0131 optimizasyon teknikleri mevcuttur. Bu ipu\u00e7lar\u0131, \u00f6zellikle b\u00fcy\u00fck veri k\u00fcmeleri veya derin \u00f6zyineleme gerektiren durumlarda kritik \u00f6neme sahip olabilir.<\/p>\n<ol>\n<li>\n<h4>Kuyruk \u00d6zyinelemesi (Tail Recursion)<\/h4>\n<p>        Kuyruk \u00f6zyinelemesi, \u00f6zyinelemeli \u00e7a\u011fr\u0131n\u0131n fonksiyonun yapt\u0131\u011f\u0131 son i\u015flem oldu\u011fu \u00f6zel bir \u00f6zyineleme t\u00fcr\u00fcd\u00fcr. Yani, \u00f6zyinelemeli \u00e7a\u011fr\u0131dan sonra ba\u015fka bir hesaplama veya i\u015flem yap\u0131lmaz. Baz\u0131 derleyiciler (\u00f6zellikle fonksiyonel programlama dillerinde yayg\u0131n olanlar), kuyruk \u00f6zyinelemesini &#8220;kuyruk \u00e7a\u011fr\u0131s\u0131 optimizasyonu&#8221; (tail call optimization &#8211; TCO) ad\u0131 verilen bir teknikle otomatik olarak yinelemeye d\u00f6n\u00fc\u015ft\u00fcrebilir. Bu optimizasyon sayesinde, her \u00f6zyinelemeli \u00e7a\u011fr\u0131 i\u00e7in yeni bir y\u0131\u011f\u0131n \u00e7er\u00e7evesi olu\u015fturmak yerine, mevcut y\u0131\u011f\u0131n \u00e7er\u00e7evesi yeniden kullan\u0131labilir. Bu da y\u0131\u011f\u0131n ta\u015fmas\u0131 riskini ortadan kald\u0131r\u0131r ve performans\u0131 art\u0131r\u0131r.<\/p>\n<p>\u00d6rnek: Fakt\u00f6riyel fonksiyonunu kuyruk \u00f6zyinelemesi ile yazma<\/p>\n<div class=\"code-container\">\n<pre><code>\nint faktoriyelKuyrukYardimcisi(int n, int accumulator) {\n    if (n == 0) {\n        return accumulator; \/\/ Temel durum\n    }\n    \/\/ \u00d6zyinelemeli \u00e7a\u011fr\u0131 son i\u015flem oldu\u011fu i\u00e7in kuyruk \u00f6zyinelemesidir\n    return faktoriyelKuyrukYardimcisi(n - 1, n * accumulator);\n}\n\nint faktoriyelKuyruk(int n) {\n    return faktoriyelKuyrukYardimcisi(n, 1); \/\/ Ba\u015flang\u0131\u00e7 de\u011feri 1 olan bir accumulator ile \u00e7a\u011f\u0131r\n}\n          <\/code><\/pre>\n<\/p><\/div>\n<p>Bu \u00f6rnekte, <code>faktoriyelKuyrukYardimcisi<\/code> fonksiyonundaki \u00f6zyinelemeli \u00e7a\u011fr\u0131, fonksiyonun son i\u015flemidir. C++ standard\u0131 TCO&#8217;yu garanti etmese de, GCC ve Clang gibi modern derleyiciler genellikle optimizasyon seviyeleri (\u00f6rne\u011fin <code>-O2<\/code> veya <code>-O3<\/code>) etkinle\u015ftirildi\u011finde bunu ger\u00e7ekle\u015ftirir.<\/p>\n<\/li>\n<li>\n<h4>Dinamik Programlama ve Bellekleme (Memoization)<\/h4>\n<p>        Baz\u0131 \u00f6zyinelemeli problemler, ayn\u0131 alt problemleri tekrar tekrar \u00e7\u00f6zer. \u00d6rne\u011fin, Fibonacci serisi hesaplamas\u0131nda <code>fib(5)<\/code> i\u00e7in <code>fib(4)<\/code> ve <code>fib(3)<\/code>&#8216;\u00fc hesaplaman\u0131z gerekirken, <code>fib(4)<\/code> i\u00e7in de tekrar <code>fib(3)<\/code> ve <code>fib(2)<\/code>&#8216;yi hesaplars\u0131n\u0131z. Bu durum, gereksiz ve tekrarlayan hesaplamalara yol a\u00e7ar, performans\u0131 d\u00fc\u015f\u00fcr\u00fcr.<\/p>\n<p>Bellekleme (memoization), daha \u00f6nce hesaplanm\u0131\u015f alt problemlerin sonu\u00e7lar\u0131n\u0131 bir veri yap\u0131s\u0131nda (genellikle bir dizi veya hash haritas\u0131) saklama tekni\u011fidir. Bir alt problem \u00e7\u00f6z\u00fclmeden \u00f6nce, sonucun zaten hesaplan\u0131p hesaplanmad\u0131\u011f\u0131 kontrol edilir. E\u011fer hesaplanm\u0131\u015fsa, depolanan sonu\u00e7 do\u011frudan kullan\u0131l\u0131r; aksi takdirde, alt problem \u00e7\u00f6z\u00fcl\u00fcr ve sonucu depolan\u0131r.<\/p>\n<p>\u00d6rnek: Bellekleme ile Fibonacci Serisi<\/p>\n<div class=\"code-container\">\n<pre><code>\n#include <vector>\n#include <map>\n\n\/\/ std::vector<long long> memo; \/\/ Global veya s\u0131n\u0131f \u00fcyesi olarak tan\u0131mlanabilir\nstd::map<int, long long> memo; \/\/ Dinamik boyut i\u00e7in map daha uygun olabilir\n\nlong long fibonacciMemo(int n) {\n    if (n <= 1) {\n        return n;\n    }\n    \/\/ E\u011fer sonu\u00e7 daha \u00f6nce hesapland\u0131ysa, depolanan de\u011feri d\u00f6nd\u00fcr\n    if (memo.count(n)) { \/\/ C++11 sonras\u0131 map i\u00e7in count() veya find() kullan\u0131labilir\n        return memo[n];\n    }\n    \/\/ Hesapla ve depola\n    long long result = fibonacciMemo(n - 1) + fibonacciMemo(n - 2);\n    memo[n] = result;\n    return result;\n}\n          <\/code><\/pre>\n<\/p><\/div>\n<p>Bu y\u00f6ntem, \u00f6zellikle \u00fcst \u00fcste binen alt problemlere sahip \u00f6zyinelemeli algoritmalar\u0131n (dinamik programlama problemleri) performans\u0131n\u0131 katlanarak art\u0131r\u0131r.<\/p>\n<\/li>\n<li>\n<h4>Yinelemeli \u00c7\u00f6z\u00fcme D\u00f6n\u00fc\u015ft\u00fcrme<\/h4>\n<p>        En g\u00fcvenli ve genellikle en performansl\u0131 optimizasyon yolu, \u00f6zyinelemeli bir \u00e7\u00f6z\u00fcm\u00fc e\u015fde\u011fer yinelemeli (d\u00f6ng\u00fcler kullanan) bir \u00e7\u00f6z\u00fcme d\u00f6n\u00fc\u015ft\u00fcrmektir. Bu, \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131 y\u00fck\u00fcn\u00fc tamamen ortadan kald\u0131r\u0131r ve y\u0131\u011f\u0131n ta\u015fmas\u0131 riskini s\u0131f\u0131ra indirir. Her \u00f6zyinelemeli fonksiyon, teorik olarak yinelemeli bir fonksiyona d\u00f6n\u00fc\u015ft\u00fcr\u00fclebilir. Bu d\u00f6n\u00fc\u015f\u00fcm, bazen bir y\u0131\u011f\u0131n veri yap\u0131s\u0131n\u0131 manuel olarak y\u00f6netmeyi gerektirebilir (\u00f6rne\u011fin, a\u011fa\u00e7 ge\u00e7i\u015flerinde).<\/p>\n<p>\u00d6rnek: Yinelemeli Fakt\u00f6riyel<\/p>\n<div class=\"code-container\">\n<pre><code>\nlong long faktoriyelIteratif(int n) {\n    if (n < 0) return 0; \/\/ Ge\u00e7ersiz giri\u015f\n    long long result = 1;\n    for (int i = 1; i <= n; ++i) {\n        result *= i;\n    }\n    return result;\n}\n          <\/code><\/pre>\n<\/p><\/div>\n<p>Bu yinelemeli versiyon, \u00f6zyinelemeli versiyondan genellikle daha h\u0131zl\u0131 ve bellek a\u00e7\u0131s\u0131ndan daha verimlidir.<\/p>\n<\/li>\n<li>\n<h4>Algoritma Se\u00e7imi ve Veri Yap\u0131lar\u0131<\/h4>\n<p>        Bazen sorun \u00f6zyinelemenin kendisinde de\u011fil, se\u00e7ilen algoritman\u0131n do\u011fas\u0131nda yatar. \u00d6rne\u011fin, bir a\u011fa\u00e7ta arama yaparken, dengesiz bir a\u011fa\u00e7ta \u00f6zyineleme \u00e7ok derinle\u015febilir. Bu durumda, a\u011fac\u0131 dengelemek (AVL a\u011fa\u00e7lar\u0131, K\u0131rm\u0131z\u0131-Siyah a\u011fa\u00e7lar gibi) veya alternatif arama stratejileri (geni\u015flik \u00f6ncelikli arama yerine derinlik \u00f6ncelikli arama) kullanmak faydal\u0131 olabilir.\n    <\/li>\n<\/ol>\n<p>\u00d6zyineleme, do\u011fru kullan\u0131ld\u0131\u011f\u0131nda kodunuzu daha okunabilir ve zarif hale getirebilir. Ancak, b\u00fcy\u00fck \u00f6l\u00e7ekli veya performans a\u00e7\u0131s\u0131ndan kritik uygulamalarda, yukar\u0131da belirtilen optimizasyon tekniklerini g\u00f6z \u00f6n\u00fcnde bulundurmak, potansiyel tuzaklardan ka\u00e7\u0131nman\u0131za ve daha sa\u011flam, verimli yaz\u0131l\u0131mlar geli\u015ftirmenize yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<p>\u00d6zyineleme, C++ programlamada g\u00fc\u00e7l\u00fc, zarif ve bazen vazge\u00e7ilmez bir ara\u00e7t\u0131r. Bir fonksiyonun kendi kendini \u00e7a\u011f\u0131rmas\u0131 prensibine dayanan bu teknik, \u00f6zellikle hiyerar\u015fik veya b\u00f6l ve y\u00f6net (divide and conquer) tipi problemlerde kodun okunabilirli\u011fini ve anla\u015f\u0131l\u0131rl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. Temel durum (base case) ile sonsuz d\u00f6ng\u00fcden ka\u00e7\u0131nma, \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131 (call stack) ve LIFO (Last-In, First-Out) prensibi ile fonksiyon \u00e7a\u011fr\u0131lar\u0131n\u0131n nas\u0131l y\u00f6netildi\u011fini anlama, \u00f6zyinelemeyi etkin bir \u015fekilde kullanman\u0131n anahtarlar\u0131d\u0131r.<\/p>\n<p>Ancak, \u00f6zyinelemenin potansiyel tehlikesi olan y\u0131\u011f\u0131n ta\u015fmas\u0131 (stack overflow) riskini de g\u00f6z ard\u0131 etmemek gerekir. Bu risk, do\u011fru temel durumun belirlenmesi, \u00f6zyineleme derinli\u011finin kontrol alt\u0131nda tutulmas\u0131 ve gerekti\u011finde yinelemeli \u00e7\u00f6z\u00fcmlere ge\u00e7i\u015f veya kuyruk \u00f6zyinelemesi gibi optimizasyon teknikleriyle y\u00f6netilebilir. \u00d6zyineleme ve yineleme aras\u0131nda do\u011fru se\u00e7imi yapmak, problemin do\u011fas\u0131na, performans gereksinimlerine ve kodun bak\u0131m kolayl\u0131\u011f\u0131na ba\u011fl\u0131d\u0131r. Her iki yakla\u015f\u0131m\u0131n da programc\u0131n\u0131n ara\u00e7 kutusunda \u00f6nemli bir yeri vard\u0131r ve hangisinin ne zaman kullan\u0131laca\u011f\u0131n\u0131 bilmek, daha yetkin bir yaz\u0131l\u0131m geli\u015ftiricisi olman\u0131n \u00f6nemli bir par\u00e7as\u0131d\u0131r.<\/p>\n<h4>S\u0131k\u00e7a Sorulan Sorular<\/h4>\n<p><strong>1. Her \u00f6zyinelemeli fonksiyon yinelemeli olarak yaz\u0131labilir mi?<\/strong><\/p>\n<p>Evet, teorik olarak her \u00f6zyinelemeli fonksiyon e\u015fde\u011fer bir yinelemeli (iterative) versiyona d\u00f6n\u00fc\u015ft\u00fcr\u00fclebilir. Bu d\u00f6n\u00fc\u015f\u00fcm genellikle manuel olarak bir y\u0131\u011f\u0131n (stack) veri yap\u0131s\u0131 kullanarak \u00f6zyinelemeli \u00e7a\u011fr\u0131lar\u0131n durumunu takip etmeyi gerektirir. Ancak, baz\u0131 durumlarda bu d\u00f6n\u00fc\u015f\u00fcm, \u00f6zyinelemeli versiyondan daha karma\u015f\u0131k ve okunabilirli\u011fi daha d\u00fc\u015f\u00fck bir kodla sonu\u00e7lanabilir.<\/p>\n<p><strong>2. \u00d6zyineleme performans\u0131 neden yinelemeden daha k\u00f6t\u00fc olabilir?<\/strong><\/p>\n<p>\u00d6zyineleme, her fonksiyon \u00e7a\u011fr\u0131s\u0131nda \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131na yeni bir y\u0131\u011f\u0131n \u00e7er\u00e7evesi (stack frame) ekler. Bu i\u015flem, yerel de\u011fi\u015fkenlerin, parametrelerin ve d\u00f6n\u00fc\u015f adresinin belle\u011fe kaydedilmesi gibi ek y\u00fckler (overhead) getirir. Yinelemeli d\u00f6ng\u00fcler ise bu t\u00fcr bir y\u0131\u011f\u0131n y\u00f6netimi y\u00fck\u00fcne sahip de\u011fildir, bu nedenle genellikle daha az i\u015flemci s\u00fcresi ve bellek t\u00fcketirler. Ancak, kuyruk \u00f6zyinelemesi optimizasyonu veya belleklemeli \u00f6zyineleme gibi teknikler bu performans fark\u0131n\u0131 azaltabilir.<\/p>\n<p><strong>3. Y\u0131\u011f\u0131n ta\u015fmas\u0131n\u0131 engellemek i\u00e7in ne yapmal\u0131y\u0131m?<\/strong><\/p>\n<p>Y\u0131\u011f\u0131n ta\u015fmas\u0131n\u0131 engellemenin en \u00f6nemli yolu, her \u00f6zyinelemeli fonksiyonda do\u011fru ve her zaman ula\u015f\u0131labilir bir temel durum (base case) tan\u0131mlamakt\u0131r. Ayr\u0131ca, \u00f6zyineleme derinli\u011finin \u00e7ok fazla olabilece\u011fi durumlarda, yinelemeli bir \u00e7\u00f6z\u00fcme ge\u00e7meyi, kuyruk \u00f6zyinelemesi kullanmay\u0131 (e\u011fer derleyici destekliyorsa) veya belleklemeyi (memoization) d\u00fc\u015f\u00fcnmelisiniz. Program\u0131n\u0131z\u0131n y\u0131\u011f\u0131n boyutunu art\u0131rmak ge\u00e7ici bir \u00e7\u00f6z\u00fcm olabilir ancak genellikle temel sorunu \u00e7\u00f6zmez.<\/p>\n<p><strong>4. \u00d6zyineleme kullanman\u0131n temel faydas\u0131 nedir?<\/strong><\/p>\n<p>\u00d6zyinelemenin temel faydas\u0131, \u00f6zellikle do\u011fal olarak \u00f6zyinelemeli yap\u0131ya sahip problemleri (\u00f6rne\u011fin a\u011fa\u00e7 ge\u00e7i\u015fleri, fraktallar, belirli matematiksel tan\u0131mlar) daha zarif, k\u0131sa ve okunabilir bir kodla \u00e7\u00f6zebilmesidir. Bu t\u00fcr problemler i\u00e7in \u00f6zyineleme, genellikle yinelemeli bir \u00e7\u00f6z\u00fcmden daha sezgisel ve problemin tan\u0131m\u0131na daha yak\u0131n bir ifade sunar.<\/p>\n<p><strong>5. C++'ta kuyruk \u00f6zyinelemesi optimizasyonu garanti ediliyor mu?<\/strong><\/p>\n<p>Hay\u0131r, C++ standard\u0131 kuyruk \u00f6zyinelemesi optimizasyonunu (Tail Call Optimization - TCO) garanti etmez. Ancak, GCC ve Clang gibi modern derleyiciler, belirli optimizasyon seviyeleri (\u00f6rne\u011fin <code>-O2<\/code> veya <code>-O3<\/code>) etkinle\u015ftirildi\u011finde kuyruk \u00f6zyinelemesini genellikle yinelemeli koda d\u00f6n\u00fc\u015ft\u00fcrerek optimize ederler. Bu nedenle, performans kritik durumlarda derleyicinizin davran\u0131\u015f\u0131n\u0131 test etmek \u00f6nemlidir.<\/p>\n<p>#Cplusplus #Recursion #Ozyineleme #Programlama #VeriYapilari #Algoritma<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/recursion-base-case-stack-overflow\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/recursion-base-case-stack-overflow<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"int faktoriyel(int n) { \/\/ Temel Durum (Base Case): \u00d6zyinelemenin durma noktas\u0131 if (n == 0) { return 1; } \/\/ \u00d6zyinelemeli Ad\u0131m (Recursive Step): Problemi daha k\u00fc\u00e7\u00fc\u011fe indirgeme return n * faktoriyel(n &#8211; 1); } Bu \u00f6rnekte, faktoriyel(n) fonksiyonu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda: E\u011fer n 0 ise (temel durum), fonksiyon do\u011frudan 1 d\u00f6nd\u00fcr\u00fcr ve ba\u015fka bir \u00e7a\u011fr\u0131 yapmaz.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1489],"tags":[],"class_list":{"0":"post-43652","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-c-2","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>C++&#039;ta \u00d6zyineleme: Temel Durumdan Y\u0131\u011f\u0131n Ta\u015fmas\u0131na Kadar Basit Bir Bak\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C++&#039;ta \u00d6zyineleme: Temel Durumdan Y\u0131\u011f\u0131n Ta\u015fmas\u0131na Kadar Basit Bir Bak\u0131\u015f\" \/>\n<meta property=\"og:description\" content=\"int faktoriyel(int n) { \/\/ Temel Durum (Base Case): \u00d6zyinelemenin durma noktas\u0131 if (n == 0) { return 1; } \/\/ \u00d6zyinelemeli Ad\u0131m (Recursive Step): Problemi daha k\u00fc\u00e7\u00fc\u011fe indirgeme return n * faktoriyel(n - 1); } Bu \u00f6rnekte, faktoriyel(n) fonksiyonu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda: E\u011fer n 0 ise (temel durum), fonksiyon do\u011frudan 1 d\u00f6nd\u00fcr\u00fcr ve ba\u015fka bir \u00e7a\u011fr\u0131 yapmaz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-27T18:06:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-27T18:06:44+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"C++&#8217;ta \u00d6zyineleme: Temel Durumdan Y\u0131\u011f\u0131n Ta\u015fmas\u0131na Kadar Basit Bir Bak\u0131\u015f\",\"datePublished\":\"2026-07-27T18:06:25+00:00\",\"dateModified\":\"2026-07-27T18:06:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/\"},\"wordCount\":4872,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"C++\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/\",\"name\":\"C++'ta \u00d6zyineleme: Temel Durumdan Y\u0131\u011f\u0131n Ta\u015fmas\u0131na Kadar Basit Bir Bak\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-07-27T18:06:25+00:00\",\"dateModified\":\"2026-07-27T18:06:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C++&#8217;ta \u00d6zyineleme: Temel Durumdan Y\u0131\u011f\u0131n Ta\u015fmas\u0131na Kadar Basit Bir Bak\u0131\u015f\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"C++'ta \u00d6zyineleme: Temel Durumdan Y\u0131\u011f\u0131n Ta\u015fmas\u0131na Kadar Basit Bir Bak\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/","og_locale":"tr_TR","og_type":"article","og_title":"C++'ta \u00d6zyineleme: Temel Durumdan Y\u0131\u011f\u0131n Ta\u015fmas\u0131na Kadar Basit Bir Bak\u0131\u015f","og_description":"int faktoriyel(int n) { \/\/ Temel Durum (Base Case): \u00d6zyinelemenin durma noktas\u0131 if (n == 0) { return 1; } \/\/ \u00d6zyinelemeli Ad\u0131m (Recursive Step): Problemi daha k\u00fc\u00e7\u00fc\u011fe indirgeme return n * faktoriyel(n - 1); } Bu \u00f6rnekte, faktoriyel(n) fonksiyonu \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda: E\u011fer n 0 ise (temel durum), fonksiyon do\u011frudan 1 d\u00f6nd\u00fcr\u00fcr ve ba\u015fka bir \u00e7a\u011fr\u0131 yapmaz.","og_url":"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-07-27T18:06:25+00:00","article_modified_time":"2026-07-27T18:06:44+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"C++&#8217;ta \u00d6zyineleme: Temel Durumdan Y\u0131\u011f\u0131n Ta\u015fmas\u0131na Kadar Basit Bir Bak\u0131\u015f","datePublished":"2026-07-27T18:06:25+00:00","dateModified":"2026-07-27T18:06:44+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/"},"wordCount":4872,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["C++"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/","url":"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/","name":"C++'ta \u00d6zyineleme: Temel Durumdan Y\u0131\u011f\u0131n Ta\u015fmas\u0131na Kadar Basit Bir Bak\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-07-27T18:06:25+00:00","dateModified":"2026-07-27T18:06:44+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/cta-ozyineleme-temel-durumdan-yigin-tasmasina-kadar-basit-bir-bakis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"C++&#8217;ta \u00d6zyineleme: Temel Durumdan Y\u0131\u011f\u0131n Ta\u015fmas\u0131na Kadar Basit Bir Bak\u0131\u015f"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43652","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=43652"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43652\/revisions"}],"predecessor-version":[{"id":43653,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43652\/revisions\/43653"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=43652"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=43652"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=43652"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}