🔄 0.6: İç İçe Döngüler

Nested Loops, Desen Çizimi ve Matris İşlemleri

📖 İç İçe Döngü Nedir?

İç içe döngü (nested loop), bir döngünün içinde başka bir döngünün bulunmasıdır. Dış döngü her çalıştığında, iç döngü baştan sona kadar tamamen çalışır.

🎯 Ne Zaman Kullanılır?
  • Çarpım tablosu oluşturma
  • Yıldız desenleri çizme
  • 2D dizi (matris) işlemleri
  • Tüm kombinasyonları deneme

🏗️ 1. Temel Yapı

📌 İç İçe for Döngüsü

for i in range(3):      # Dış döngü: 3 kez
    for j in range(4):  # İç döngü: 4 kez
        print(f"i={i}, j={j}")
    print("---")        # Her dış döngü sonunda
i=0, j=0 i=0, j=1 i=0, j=2 i=0, j=3 --- i=1, j=0 i=1, j=1 i=1, j=2 i=1, j=3 --- i=2, j=0 i=2, j=1 i=2, j=2 i=2, j=3 ---
💡 Toplam Tekrar Sayısı:

Dış döngü m kez, iç döngü n kez çalışıyorsa, toplam m × n kez çalışır.

Yukarıdaki örnekte: 3 × 4 = 12 kez print çalışır.

📊 İzleme Tablosu (Trace Table)

Dış (i) İç (j) Çıktı
00i=0, j=0
01i=0, j=1
02i=0, j=2
03i=0, j=3
---
10i=1, j=0
11i=1, j=1
... devam eder

⭐ 2. Yıldız Desenleri

İç içe döngülerle çeşitli desenler oluşturabiliriz:

Dikdörtgen
***** ***** ***** *****
Sağ Üçgen
* ** *** **** *****
Ters Üçgen
***** **** *** ** *
Piramit
* *** ***** ******* *********

📌 Dikdörtgen (n × m)

n = 4  # satır
m = 5  # sütun

for i in range(n):
    for j in range(m):
        print("*", end="")
    print()  # Satır sonu
***** ***** ***** *****

📌 Sağ Üçgen

n = 5

for i in range(1, n + 1):
    for j in range(i):
        print("*", end="")
    print()
* ** *** **** *****

📌 Ters Üçgen

n = 5

for i in range(n, 0, -1):
    for j in range(i):
        print("*", end="")
    print()
***** **** *** ** *

📌 Piramit

n = 5

for i in range(1, n + 1):
    # Boşluklar
    for j in range(n - i):
        print(" ", end="")
    # Yıldızlar
    for j in range(2 * i - 1):
        print("*", end="")
    print()
* *** ***** ******* *********

📌 Sayı Piramidi

n = 5

for i in range(1, n + 1):
    for j in range(1, i + 1):
        print(j, end="")
    print()
1 12 123 1234 12345

✖️ 3. Çarpım Tablosu

📌 Tam Çarpım Tablosu

print("    ", end="")
for i in range(1, 11):
    print(f"{i:4}", end="")
print("\n" + "-" * 44)

for i in range(1, 11):
    print(f"{i:2} |", end="")
    for j in range(1, 11):
        print(f"{i*j:4}", end="")
    print()
1 2 3 4 5 6 7 8 9 10 -------------------------------------------- 1 | 1 2 3 4 5 6 7 8 9 10 2 | 2 4 6 8 10 12 14 16 18 20 3 | 3 6 9 12 15 18 21 24 27 30 4 | 4 8 12 16 20 24 28 32 36 40 5 | 5 10 15 20 25 30 35 40 45 50 6 | 6 12 18 24 30 36 42 48 54 60 7 | 7 14 21 28 35 42 49 56 63 70 8 | 8 16 24 32 40 48 56 64 72 80 9 | 9 18 27 36 45 54 63 72 81 90 10 | 10 20 30 40 50 60 70 80 90 100

📋 4. Listelerle İç İçe Döngüler

📌 2D Liste (Matris) Oluşturma

# 3x4 boyutunda matris
satir = 3
sutun = 4

matris = []
for i in range(satir):
    satir_listesi = []
    for j in range(sutun):
        satir_listesi.append(i * sutun + j + 1)
    matris.append(satir_listesi)

# Matrisi yazdır
for satir in matris:
    print(satir)
[1, 2, 3, 4] [5, 6, 7, 8] [9, 10, 11, 12]

📌 Matris Elemanlarını Dolaşma

matris = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

toplam = 0
for i in range(len(matris)):
    for j in range(len(matris[i])):
        print(f"matris[{i}][{j}] = {matris[i][j]}")
        toplam += matris[i][j]

print(f"\nToplam: {toplam}")

📌 En Büyük Elemanı Bulma

matris = [
    [3, 7, 2],
    [9, 1, 8],
    [4, 6, 5]
]

en_buyuk = matris[0][0]

for i in range(len(matris)):
    for j in range(len(matris[i])):
        if matris[i][j] > en_buyuk:
            en_buyuk = matris[i][j]

print(f"En büyük eleman: {en_buyuk}")  # 9

🎯 5. Pratik Örnekler

📌 Örnek 1: Aritmetik Ortalama (Mean)

a = [7, 10, 4, 44]

i = 0
toplam = 0

while i < len(a):
    toplam += a[i]
    i += 1

mean = toplam / len(a)
print(f"Ortalama: {mean}")
📊 İstatistik: Aritmetik Ortalama (Mean)

Ortalama, tüm değerlerin toplamının değer sayısına bölümüdür:

$\bar{x} = \frac{1}{n} \sum_{i=1}^{n} x_i = \frac{x_1 + x_2 + ... + x_n}{n}$

Kullanım: Veri setinin merkezi eğilimini gösterir. Notlar, maaşlar, sıcaklıklar gibi verilerin özetlenmesinde kullanılır.

📌 Örnek 2: Varyans Hesaplama

📊 İstatistik: Varyans (Variance)

Varyans, verilerin ortalamadan ne kadar uzaklaştığını ölçer:

Popülasyon Varyansı: $\sigma^2 = \frac{1}{N} \sum_{i=1}^{N} (x_i - \mu)^2$

Örneklem Varyansı: $s^2 = \frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})^2$

Neden n-1? Bessel düzeltmesi - örneklemden popülasyon varyansını tahmin ederken sapma olmaması için.

a = [7, 10, 4, 44]

# Önce ortalamayı hesapla
i = 0
toplam = 0
while i < len(a):
    toplam += a[i]
    i += 1
mean = toplam / len(a)

# Sonra varyansı hesapla
j = 0
sigma = 0
while j < len(a):
    fark_kare = (a[j] - mean) ** 2
    sigma += fark_kare
    j += 1

varyans = sigma / (len(a) - 1)  # Örneklem varyansı
print(f"Ortalama: {mean}")
print(f"Varyans: {varyans}")
Ortalama: 16.25 Varyans: 336.25

📌 Örnek 2.5: Standart Sapma (Standard Deviation)

📊 İstatistik: Standart Sapma

Standart sapma, varyansın karekökü olup verilerin orijinal birimiyle ifade edilir:

$s = \sqrt{s^2} = \sqrt{\frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})^2}$

a = [7, 10, 4, 44]

# Ortalama
toplam = 0
for x in a:
    toplam += x
mean = toplam / len(a)

# Varyans
sigma = 0
for x in a:
    sigma += (x - mean) ** 2
varyans = sigma / (len(a) - 1)

# Standart sapma (varyansın karekökü)
std = varyans ** 0.5

print(f"Ortalama: {mean}")
print(f"Varyans: {varyans:.2f}")
print(f"Standart Sapma: {std:.2f}")
Ortalama: 16.25 Varyans: 336.25 Standart Sapma: 18.34

📌 Örnek 3: Min-Max Bulma (Verimli)

a = [-128, 62, 9000, -987, -85600]

# Liste üzerinde dolaşarak min-max bul
min_val = a[0]
max_val = a[0]

i = 1
while i < len(a):
    if a[i] < min_val:
        min_val = a[i]
    if a[i] > max_val:
        max_val = a[i]
    i += 1

print(f"Minimum: {min_val}")  # -85600
print(f"Maximum: {max_val}")  # 9000

📌 Örnek 4: Toplam Bulma (Sağdan Sola)

a = [-128, 62, 9000, -987, -85600]

i = len(a) - 1  # Son elemandan başla
toplam = 0

while i >= 0:
    toplam += a[i]
    i -= 1

print(f"Toplam: {toplam}")

📌 Örnek 5: Asal Sayıları Listeleme

n = int(input("Kaça kadar asal sayılar? "))

print(f"2'den {n}'e kadar asal sayılar:")

for sayi in range(2, n + 1):
    asal = True
    
    for i in range(2, int(sayi ** 0.5) + 1):
        if sayi % i == 0:
            asal = False
            break
    
    if asal:
        print(sayi, end=" ")

print()
2'den 50'ye kadar asal sayılar: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47

📌 Örnek 6: Baklava Deseni

n = 5

# Üst yarı (piramit)
for i in range(1, n + 1):
    print(" " * (n - i), end="")
    print("*" * (2 * i - 1))

# Alt yarı (ters piramit)
for i in range(n - 1, 0, -1):
    print(" " * (n - i), end="")
    print("*" * (2 * i - 1))
* *** ***** ******* ********* ******* ***** *** *

⚡ 6. İç İçe Döngülerde break ve continue

⚠️ Dikkat: break ve continue sadece en içteki döngüyü etkiler!

📌 break Sadece İç Döngüyü Kırar

for i in range(3):
    print(f"Dış döngü: i={i}")
    for j in range(5):
        if j == 2:
            break  # Sadece iç döngüden çıkar
        print(f"  İç döngü: j={j}")
    print("  İç döngü bitti")
Dış döngü: i=0 İç döngü: j=0 İç döngü: j=1 İç döngü bitti Dış döngü: i=1 İç döngü: j=0 İç döngü: j=1 İç döngü bitti Dış döngü: i=2 İç döngü: j=0 İç döngü: j=1 İç döngü bitti

📌 Tüm Döngülerden Çıkmak İçin

# Yöntem 1: Flag değişkeni
bulundu = False

for i in range(10):
    for j in range(10):
        if i * j == 15:
            print(f"Bulundu: i={i}, j={j}")
            bulundu = True
            break
    if bulundu:
        break

# Yöntem 2: Fonksiyon kullanma (daha temiz)
def ara():
    for i in range(10):
        for j in range(10):
            if i * j == 15:
                return (i, j)
    return None

sonuc = ara()
print(f"Sonuç: {sonuc}")

📋 Özet

Bu Derste Öğrendiklerimiz:
  1. İç içe döngü: Döngü içinde döngü
  2. Toplam tekrar: m × n (dış × iç)
  3. Yıldız desenleri: Dikdörtgen, üçgen, piramit
  4. Matris işlemleri: 2D dizi dolaşma
  5. break/continue: Sadece en içteki döngüyü etkiler
🎯 İpuçları:
  • Dış döngü: satır sayısı
  • İç döngü: sütun sayısı (veya o satırdaki eleman sayısı)
  • print(end="") → Aynı satırda yazdır
  • print() → Yeni satıra geç