0Pricing
Coding Interview Prep · Ders

Çapa ve Özyinelemeli Üyeler

Özyinelemeli bir CTE'nin iki parçalı yapısını ve sonlandırmanın nasıl çalıştığını öğrenin.

Çapa ve Özyinelemeli Üyeler, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding Interview Prep kursu toplamda 4 dersten oluşur.

Yinelemeli CTE'ler Neden Gündeme Gelir

Bir görüşmeci size bir organizasyon şeması, bir malzeme listesi veya bir kategori ağacı verip her alt düğümü istediğinde, yinelemeli CTE kullanmayı düşünüp düşünmediğinizi sınar. Sıradan birleşimler yalnızca sabit sayıda düzeyde ilerleyebilir; yineleme ise herhangi bir derinlikte ilerler.

Sorudaki ipucu genellikle “herhangi bir derinliğe kadar” veya “en alt düzeye kadar” ifadesidir. Bu, harekete geçmeniz gerektiğini gösterir. Bu derste, her yinelemeli CTE'nin paylaştığı iki parçalı yapıyı öğreneceksiniz: başlangıç üyesi ve yinelemeli üye.

İki Parçalı İskelet

Yinelemeli bir CTE'de her zaman WITH RECURSIVE anahtar sözcüğü bulunur (Postgres, SQLite, MySQL 8+; SQL Server RECURSIVE sözcüğünü kullanmaz) ve gövde, UNION ALL ile birleştirilen iki sorgudan oluşur:

  • Başlangıç üyesi — başlangıç satırlarıdır ve bir kez çalışır.
  • Yinelemeli üye — CTE adının kendisine başvurur ve tekrarlı olarak çalışır.

Bu iskeleti ezberleyin; görüşmeciler sizden bunu sıfırdan yazmanızı istemeyi sever.

WITH RECURSIVE cte AS (
    -- anchor member
    SELECT ...
    UNION ALL
    -- recursive member
    SELECT ... FROM cte JOIN ...
)
SELECT * FROM cte;

Başlangıç Üyesi Ne Yapar

Başlangıç üyesi, CTE'ye başvurmayan sıradan bir sorgudur. Başlangıç satırlarını, yani sıfırıncı düzeydeki başlangıç noktalarını üretir. Bir organizasyon şemasında bu genellikle CEO'dur (yöneticisi NULL olan satır); sayı dizisinde ise ilk sayıdır.

Başlangıç üyesi tam olarak bir kez çalışır. Çıktısı, yinelemeli adıma aktarılacak ilk satır grubuna dönüşür.

-- Anchor: the top of the hierarchy
SELECT id, name, manager_id, 1 AS depth
FROM employees
WHERE manager_id IS NULL

Yinelemeli Üye Ne Yapar

Yinelemeli üye, CTE'ye adıyla başvurur. Her yinelemede, bir sonraki düzeyi bulmak için önceki yinelemede üretilen satırları temel tabloyla birleştirir.

O ana kadarki CTE'nin tamamını değil, yalnızca hemen önceki adımda eklenen satırları görür. Görüşmecilerin yokladığı temel zihinsel model budur.

-- Recursive: children of the rows found so far
SELECT e.id, e.name, e.manager_id, c.depth + 1
FROM employees e
JOIN cte c ON e.manager_id = c.id

Hepsini Bir Araya Getirme

Başlangıç ve yinelemeli üyeleri UNION ALL ile birleştirdiğinizde, motor yinelemeyi kendiliğinden yürütür. Her geçiş, yinelemeli üye sıfır satır döndürünceye kadar bir sonraki düzeyi ekler; bu noktada yineleme durur.

Aşağıda, depth bilgisini de izleyen, tamamen çalıştırılabilir bir organizasyon şeması dolaşımı yer alıyor.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id, 1 AS depth
    FROM employees
    WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id, o.depth + 1
    FROM employees e
    JOIN org o ON e.manager_id = o.id
)
SELECT id, name, depth FROM org ORDER BY depth, id;

Sonlandırma Nasıl Çalışır

Yinelemeli üye yeni satır üretmediğinde yineleme durur. Açık bir döngü sayacı gerekmez — ağacın yapraklarına ulaştığınızda birleşim doğal olarak sonuç üretmeyi bırakır.

Organizasyon şeması örneğinde, doğrudan bağlı çalışanı olmayan çalışanlara ulaştığınızda sonraki yinelemenin birleşimi hiçbir çocuk bulamaz, boş sonuç döndürür ve motor durur. Bu kendiliğinden sonlanan davranışı anlamak, klasik bir devam sorusudur.

UNION ALL ile UNION Karşılaştırması

Görüşmeciler sık sık neden UNION ALL kullandığımızı ve UNION kullanmadığımızı sorar. Bunun iki nedeni vardır:

  • Performans — UNION her yinelemede yinelenenleri kaldırır; bu da pahalıdır.
  • Doğruluk — bir ağaçta yinelenen satırlar genellikle oluşamaz, dolayısıyla yinelenenleri kaldırmak boşa yapılan bir iştir.

Yapı bir graf olduğunda ve yinelenen düğümleri bilerek tekilleştirmek istediğinizde UNION kullanın — ancak döngü güvenliği için açık kontroller daha iyidir; bunlar ileride ele alınacaktır.

Derinlik ve Yol Takibi

İki ek sütun, yinelemeli sonuçları çok daha kullanışlı hâle getirir ve görüşmelerde sıkça istenir:

  • derinlik — başlangıç üyesinde 1 ile başlayın, yinelemeli üyede 1 ekleyin.
  • yol — kökten düğüme giden güzergâhı görebilmek için kimlikler veya adlar zincirini biriktirin.

path değerini bir dize olarak oluşturmak, ileride döngüleri algılamak için de kullanılabilir.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id, 1 AS depth,
           CAST(name AS VARCHAR(1000)) AS path
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, e.manager_id, o.depth + 1,
           o.path || ' > ' || e.name
    FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT name, depth, path FROM org;

Sütun Türleri Eşleşmeli

İnce ama önemli bir ayrıntı şudur: başlangıç ve yinelemeli üyeler, aynı sayıda sütunu ve uyumlu türleri döndürmelidir. Bir path dizesi oluşturuyorsanız, başlangıç üyesindeki ilk değer yeterince geniş bir türe dönüştürülmelidir (örneğin VARCHAR(1000)); aksi hâlde motor sonraki yinelemelerde değeri kesebilir veya bir tür uyuşmazlığı hatası verebilir.

Bu, bir görüşmecinin yinelemeli bir CTE'yi yalnızca okumakla kalmayıp gerçekten çalıştırıp çalıştırmadığınızı anlamak için ortaya atabileceği türden bir ayrıntıdır.

Malzeme Listesi Örneği

Aynı iskelet bir malzeme listesi için de işe yarar: bir parça verildiğinde, herhangi bir derinlikteki tüm alt parçaları listeleyin. Başlangıç üyesi üst montajı seçer; yinelemeli üye parent_part ile child_part arasındaki bağlantıları izler.

Yapının organizasyon şemasıyla aynı olduğuna, yalnızca sütun adlarının değiştiğine dikkat edin. Tek bir iskeletin birçok probleme uyduğunu fark etmek, görüşmede asıl ihtiyaç duyulan beceridir.

WITH RECURSIVE bom AS (
    SELECT child_part, parent_part, 1 AS lvl
    FROM parts WHERE parent_part = 'ENGINE'
    UNION ALL
    SELECT p.child_part, p.parent_part, b.lvl + 1
    FROM parts p JOIN bom b ON p.parent_part = b.child_part
)
SELECT child_part, lvl FROM bom;

Diyalekt Notları

Görüşmecilerin takdir ettiği hızlı, farklı diyalektleri karşılaştıran özet:

  • PostgreSQL, SQLite, MySQL 8+: WITH RECURSIVE name AS (...).
  • SQL Server: yalnızca WITH name AS (...) kullanır — RECURSIVE anahtar sözcüğü örtüktür ve varsayılan olarak MAXRECURSION değerini 100 uygular.
  • Oracle: hem yinelemeli CTE'leri hem de eski CONNECT BY söz dizimini destekler.

“SQL Server, RECURSIVE sözcüğünü kullanmaz” demeniz, konuya gerçekten hâkim olduğunuzu gösterir.

Hızlı Kontrol

İki parçalı yapı hakkındaki kavrayışınızı sınayın.

Özet

Artık yinelemeli CTE iskeletine hâkimsiniz:

  • WITH RECURSIVE + başlangıç üyesi + UNION ALL + yinelemeli üye.
  • Başlangıç üyesi sıfırıncı düzeyi oluşturur ve bir kez çalışır.
  • Yinelemeli üye, önceki yinelemeyi temel tabloyla birleştirir ve satır döndürmeyinceye kadar çalışır.
  • UNION ALL kullanın, depth ve path değerlerini izleyin ve sütun türlerini uyumlu tutun.

Sonraki konu: bu iskeleti gerçek bir organizasyon şemasında aşağı ve yukarı doğru dolaşmak için uygulamak.

Sıkça Sorulan Sorular

“Çapa ve Özyinelemeli Üyeler” dersi ücretsiz mi?

Evet — “Çapa ve Özyinelemeli Üyeler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding Interview Prep kursu toplamda 4 dersten oluşur.

“Çapa ve Özyinelemeli Üyeler” dersinde ne öğreneceğim?

Özyinelemeli bir CTE'nin iki parçalı yapısını ve sonlandırmanın nasıl çalıştığını öğrenin. Coding Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Coding Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Coding Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.

“Çapa ve Özyinelemeli Üyeler” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Coding Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Çapa ve Özyinelemeli Üyeler
  2. Kuruluş Şemasını Dolaşma
  3. Sayı ve Tarih Serileri Oluşturma
  4. Sonsuz Özyinelemeden Kaçınma
← Coding Interview Prep Sayfasına Dön