İçeriğe geç
← Tüm yazılar
· 13 dk okuma Programlama Temelleri

Algoritma: Döngüler

Döngü (tekrar) nedir, bilgisayar aynı işi nasıl tekrarlar? Sayaçlı ve koşullu döngüleri, döngünün üç parçasını ve sonsuz döngü tuzağını kod yazmadan, kalemle öğren.

Algoritma: Döngüler

Önceki yazıda koşulları öğrendik: bir doğru/yanlış sorusuna bakıp yol ayırmak. Ama fark ettin mi, EĞER soruyu yalnızca bir kez soruyordu — cevaba göre bir dala girip yoluna devam ediyordu. Peki ya aynı işi bir değil, onlarca kez yapmak istersek? Aynı kararı tekrar tekrar sormak istersek?

İşte bu yazının konusu tam olarak bu: bir grup adımı, bir şart sağlandığı sürece tekrar tekrar çalıştırmak. Buna döngü diyoruz. Şu ana kadar programımız ya düz akıyordu ya da bir kez seçim yapıp geçiyordu; döngüyle birlikte ilk kez geriye dönüp aynı işi yineleyebilecek. Ve göreceğiz ki bir döngü, aslında bir önceki yazıdaki kararın tekrar tekrar sorulan hâlinden başka bir şey değil.

Neden döngüye ihtiyacımız var?

Diyelim ki 1’den 5’e kadar olan sayıları ekrana yazdırmak istiyorsun. Elimizde sözde kod yazısından YAZ komutu var — ekrana yazdırıyordu. Şöyle yapabilirsin:

Döngüsüz — elle tekrar
YAZ 1
YAZ 2
YAZ 3
YAZ 4
YAZ 5

Beş satır, dert değil. Peki ya 1’den 1000’e kadar? Bin satır mı yazacaksın? Ya sınır baştan belli değilse — “kullanıcı 0 girene kadar say” gibi? O zaman kaç satır yazacağını bilemezsin bile. İşte burada tıkanırız.

Oysa buradaki iş aslında tek bir kalıbın tekrarı: “bir sayı yaz, sonra onu bir artır, sınıra gelene kadar bunu sürdür.” Günlük hayatta bunu sürekli yaparsın:

  • Merdiveni çıkarken her basamakta aynı hareketi yaparsın — ta ki tepeye varana kadar.
  • Bulaşıkları yıkarken her tabak için aynı adımları tekrarlarsın — leğen boşalana kadar.
  • Koşu pistinde her turda aynı yolu koşarsın — hedef tur sayısına ulaşana kadar.

Bilgisayarın en iyi yaptığı şey tam olarak budur: bıkmadan, şaşmadan, aynı işi tekrarlamak. Döngü, ona “şunu şu şart bozulana kadar yinele” demenin yoludur. Bir kez doğru kur, ister beş kez ister beş milyon kez dönsün — senin için hep aynı.

Bir döngünün üç parçası

Her döngü hep aynı iskeletten kurulur: bir sayaç kurarsın, bir koşul sorarsın, işini yaparsın, sayacı güncellersin ve baştan koşula geri dönersin. Aslında bu iskeletle daha önce karşılaştık: akış şemaları yazısında buna kısaca “bir döngünün üç olmazsa olmazı” demiş, ama ayrıntısına girmemiştik. Şimdi o üç parçayı tek tek açalım — çünkü üçünden biri eksikse döngü ya hiç çalışmaz ya da hiç durmaz:

  1. Başlangıç — Döngüye girmeden önce bir zemin hazırlarsın: bir sayaç ya da değişken kurarsın. “Saymaya 1’den başla.” (sayı ← 1 — bu ok, değişkenler yazısından tanıdığın atama: sayı kutusuna 1 koy.)
  2. Koşul — Her turun başında sorulan bir sorudur: dönmeye devam edilecek mi? Doğruysa bir tur daha atılır, yanlış olduğu an döngü biter. “Sayı hâlâ 5’ten küçük veya eşit mi?” (sayı ≤ 5)
  3. İlerletme — Döngünün içinde, koşulu eninde sonunda bozacak adımdır. Bu adım olmazsa koşul sonsuza kadar doğru kalır. “Her turda sayıyı bir artır.” (sayı ← sayı + 1)

Bu üçlüyü aklında tut; yazının geri kalanı hep bu üç parçanın etrafında dönecek. Bir döngüye baktığında refleks olarak sor: Nerede başlıyor? Ne zaman duruyor? Onu durduran adım nerede?

Sayaçlı döngü: “tam N kere yap”

En tanıdık döngü, kaç kez döneceğini baştan bildiğin döngüdür. Bir sayaç turları sayar, sen de “şu sayıya gelene kadar dön” dersin. Akış şemaları yazısında buna sayaçlı döngü demiştik.

Sözde kodda döngüyü ZAMAN … DOĞRU İKEN ile açar, DÖNGÜ SONU ile kapatırız — tıpkı sözde kod yazısında tanıştığımız gibi. İşte 1’den 5’e kadar sayan döngü — akış şemalarında çizip sözde kodda yazdığımız o tanıdık örneğin ta kendisi — üç parçası da yerli yerinde:

1'den 5'e say — sayaçlı döngü
sayı ← 1
ZAMAN sayı ≤ 5 DOĞRU İKEN
YAZ sayı
sayı ← sayı + 1
DÖNGÜ SONU

Satır satır oku: sayıyı 1’den başlatıyoruz (başlangıç). Sonra “sayı ≤ 5 mi?” diye soruyoruz (koşul); doğruysa içeri giriyoruz, sayıyı yazıyoruz ve bir artırıyoruz (ilerletme). DÖNGÜ SONUya gelince ok başa, koşula dönüyor ve soru yeniden soruluyor. Bu, sayı 6 olup koşul “yanlış” diyene kadar sürüyor. Aynı fikri bir de akış şemasıyla görelim:

flowchart TD
    A([Başla]) --> B[sayı ← 1]
    B --> C{sayı ≤ 5 mi?}
    C -- Evet --> D[YAZ sayı]
    D --> E[sayı ← sayı + 1]
    E --> C
    C -- Hayır --> F([Bitti])

O geriye dönen ok (E’den C’ye) döngünün kalbidir; onu görmek, “burada bir tekrar var” demenin en hızlı yoludur. Şimdi bu döngüyü kâğıtta elle çalıştıralım — her turda değişkenlerin ne olduğunu bir tabloya yazmak, döngüyü anlamanın en iyi yoludur:

Tursayı (turun başı)sayı ≤ 5 doğru mu?Ekrana yazılansayı (turun sonu)
11doğru12
22doğru23
33doğru34
44doğru45
55doğru56
66yanlış(döngü biter)

Altıncı turda sayı 6 olunca koşul yanlış çıkıyor ve döngü kibarca duruyor. Bu tabloya izleme tablosu diyoruz; değişkenler ve koşullar yazılarından tanıdık. Bir döngüden emin olamadığında, onu böyle kâğıtta birkaç tur yürüt — gözünle göreceksin.

Koşullu döngü: “olana kadar yap”

Her zaman kaç kez döneceğimizi bilmeyiz. Bazen “bir şey olana kadar” döneriz — kaç tur süreceği baştan belli değildir, dış bir olaya bağlıdır. Buna koşullu döngü denir. Burada turları sayan bir sayaç yoktur; döngüyü durduran şey, dünyada bir şeyin değişmesidir.

Cebinde 100 TL var ve her gün 20 TL harcıyorsun. Paran kaç gün dayanır? Kaç tur döneceğini baştan hesaplamana gerek yok — döngü, para bitene kadar kendi kendine döner:

Para bitene kadar — koşullu döngü
para ← 100
gün ← 0
ZAMAN para ≥ 20 DOĞRU İKEN
para ← para - 20
gün ← gün + 1
DÖNGÜ SONU
YAZ gün

Fark ettin mi: yapı yine aynı üç parça (başlangıç, koşul, ilerletme), ama bu kez “ilerletme” bir sayacı artırmak değil, parayı azaltmak. Koşul (para ≥ 20) bir sayıyı saymıyor, bir durumu izliyor. Döngü, para 20’nin altına düşünce duruyor. İşte akış şeması:

flowchart TD
    A([Başla]) --> B[para ← 100, gün ← 0]
    B --> C{para ≥ 20 mi?}
    C -- Evet --> D[para ← para - 20]
    D --> E[gün ← gün + 1]
    E --> C
    C -- Hayır --> F([Bitti: gün'ü yaz])

Şimdi buradaki asıl inceliğe dikkat et:

Aslında bu tür döngülerle serinin ilk gününden beri iç içeyiz. İlk yazıdaki çay demleme algoritmasının “su kaynayana kadar bekle” adımı bir koşullu döngüydü: kaç dakika süreceği belli değildir, su kaynayınca biter. Akış şemalarında çizdiğimiz, doğru şifre girilene kadar tekrar tekrar soran kapı da öyle: “şifre doğru olana kadar sormaya devam et.” Kaç deneme süreceği baştan belli değildir; kullanıcı doğru cevabı verince döngü kendiliğinden biter.

Sayaçlı mı, koşullu mu? Nasıl seçerim?

İkisini karıştırmamak için tek bir soru yeter: “Kaç kez döneceğimi baştan biliyor muyum?”

SoruSayaçlı döngüKoşullu döngü
Kaç kez dönecek?Baştan belli (“tam 10 kez”)Baştan belirsiz (“olana kadar”)
Neye bakar?Bir sayaç (sayı ≤ 10)Bir duruma (para ≥ 20, şifre yanlış)
Günlük örnek”5 tur koş""yorulana kadar koş”
Gerçek koddaki adıgenelde forgenelde while

Tablodaki for ve while kelimeleri gözünü korkutmasın; ikisi de aslında tanıdık. Sözde kod yazısının sonundaki Türkçe–İngilizce karşılıklar tablosunu hatırla: bizim ZAMAN … DOĞRU İKENimizin İngilizce karşılığı WHILE idi — gerçek koddaki while işte o. for ile de az önce tanıştın: üç parçayı tek satırda toplayan kısayol.

İkisi de aynı ZAMAN … DÖNGÜ SONU yapısıyla yazılabilir; aradaki fark, döngüyü neyin durdurduğudur. Emin değilsen kendine sor: “durma şartım bir sayıya mı, yoksa dışarıda olup biten bir şeye mi bağlı?”

Döngüyle biriktirmek: toplam ve sayma

Döngülerin en güçlü yanlarından biri, her turda küçük bir katkıyı biriktirip sonunda tek bir sonuca ulaşmaktır. Bu kalıbı aslında gördün: sözde kod yazısının sonunda 1’den 10’a kadar olan çift sayıların toplamını bulmuştuk; oradaki toplam değişkeni tam böyle tur tur birikiyordu. Şimdi o örneğin daha yalın hâlini kuralım: 1’den 10’a kadar olan bütün sayıların toplamı. Bunu yapmak için döngü değişkenimizin (sayı) yanına, sonucu biriktirecek ikinci bir değişken koyarız:

1'den 10'a kadar toplam — biriktirme
sayı ← 1
toplam ← 0
ZAMAN sayı ≤ 10 DOĞRU İKEN
toplam ← toplam + sayı
sayı ← sayı + 1
DÖNGÜ SONU
YAZ toplam

Burada iki değişken var ve rolleri bambaşka:

  • sayı, turları ilerleten döngü değişkeni (sayaç). 1, 2, 3… diye artar ve döngüyü ilerletir.
  • toplam, sonucu biriktiren biriktirici değişken. Her turda sayı kadar büyür: 0 → 1 → 3 → 6 → 10… Döngü bitince içinde nihai cevap (55) durur.

Aynı fikirle sayma da yapabilirsin: bir biriktiriciyi (adet ← 0) her uygun turda bir artırırsan, döngü bitince kaç kez olduğunu sayarsın. Toplama, sayma, en büyüğü bulma… hepsi bu “döngüden önce hazırla, her turda güncelle” kalıbının çeşitleridir.

Sonsuz döngü: en klasik tuzak

Döngünün üç parçasından ilerletmeyi unutursan ne olur? Koşul asla bozulmaz, döngü asla durmaz. Buna sonsuz döngü denir — adıyla akış şemaları yazısının tuzaklar bölümünde tanışmıştık — ve yeni başlayanların bir numaralı baş belasıdır. Şimdi onu iş üstünde yakalayalım.

Bak, ilk örneğimizden tek bir satırı silelim:

Sonsuz döngü — DİKKAT, bu bozuk!
sayı ← 1
ZAMAN sayı ≤ 5 DOĞRU İKEN
YAZ sayı
DÖNGÜ SONU

sayı ← sayı + 1 satırı gitti. Şimdi kâğıtta yürüt: sayı hep 1. “1 ≤ 5 mi?” — evet. Yaz 1. Tekrar sor: “1 ≤ 5 mi?” — yine evet. Yaz 1. Yine, yine, yine… sayı hiç değişmediği için koşul sonsuza kadar doğru kalır; program ekrana durmadan “1” basar ve asla bitmez.

Not: Bazen sonsuz döngü bilerek kurulur — örneğin bir web sitesini gece gündüz ayakta tutan program hiç durmamalıdır. Ama o zaman bile içeride, gerektiğinde döngüyü kıran özel bir çıkış bulunur. Sözde kod yazısındaki üç denemeli şifre örneğinde gördüğün DUR komutu tam bu işi yapıyordu: doğru şifre gelince döngüyü ortasından kesiyordu. Yeni başlarken kuralımız net: her döngünün bir bitişi olmalı.

İç içe döngü: döngü içinde döngü

İç içe yapılar sana yabancı değil: koşulun içine koşul koymuştuk, akış şemalarında da bir döngünün içine karar yerleştirip 1–10 arası çift sayıları yazdırmıştık. Şimdi bir adım ileri gidiyoruz: bir döngünün içine başka bir döngü koyacağız. Buna iç içe döngü denir. Küçük bir çarpım tablosu yazdıralım: 1’den 3’e kadar her satır için, o satırın 1’den 3’e kadar olan çarpımlarını basalım.

Mini çarpım tablosu — iç içe döngü
satır ← 1
ZAMAN satır ≤ 3 DOĞRU İKEN
sütun ← 1
ZAMAN sütun ≤ 3 DOĞRU İKEN
YAZ satır × sütun
sütun ← sütun + 1
DÖNGÜ SONU
satır ← satır + 1
DÖNGÜ SONU

Nasıl çalışır? Dış döngü (satır) bir tur atar, ve o tek turun içinde döngü (sütun) baştan sona tamamen döner. Yani satır = 1 iken sütun 1, 2, 3 basılır; sonra satır = 2 olur ve sütun yeniden 1, 2, 3 basılır… Dış döngü 3 kez, her seferinde iç döngü 3 kez dönerse, toplam 3 × 3 = 9 tur olur. Girintinin bir kademe daha içeri kaymasına dikkat et; hangi döngünün kime ait olduğunu yine girinti gösterir.

Sık yapılan hatalar

Kendin dene

Kalem ve kâğıt yeter. Her egzersizde önce sözde kodu yaz (üç parçayı unutma: başlangıç, koşul, ilerletme), sonra bir izleme tablosu çizip döngüyü birkaç tur elle çalıştır.

Egzersiz 1 — Geri sayım (kolay)

10’dan 1’e kadar olan sayıları, büyükten küçüğe doğru ekrana yaz (10, 9, 8, … 1).

Egzersiz 2 — Bir sayının katları (orta)

Kullanıcıdan bir sayı al (diyelim 7) ve o sayının 1’den 10’a kadar olan katlarını yaz: 7, 14, 21, … 70. Bir de en sonunda hepsinin toplamını yazdır.

Egzersiz 3 — Bakteriler çoğalıyor (mini proje)

Bir kapta 1 bakteri var ve her saat sayıları ikiye katlanıyor (1 → 2 → 4 → 8 …). Bakteri sayısının 1000’i geçmesi kaç saat sürer?

Özet

Paylaş

İlgili yazılar

Sıkça sorulan sorular

Döngü (loop) nedir?

Döngü, bir grup adımı bir koşul sağlandığı sürece tekrar tekrar çalıştırmaktır. Aynı işi elle onlarca kez yazmak yerine "şu şart bozulana kadar bunu yinele" dersin. Akış şemasındaki geriye dönen ok ve sözde koddaki ZAMAN … DÖNGÜ SONU bloğunun yaptığı iş budur; bir algoritmanın tekrarı ele almasının tek yoludur.

Sayaçlı döngü ile koşullu döngü arasındaki fark nedir?

Sayaçlı döngü "tam N kere yap" der: kaç kez döneceğini baştan bilirsin ve bir sayaç turları sayar (1'den 10'a yazdır gibi). Koşullu döngü ise "olana kadar yap" der: kaç kez döneceği belli değildir, dış bir şart bozulunca durur (doğru şifre girilene kadar sor gibi). Gerçek kodda ilki genelde for, ikincisi while ile yazılır.

Bir döngünün üç parçası nedir?

Her sağlıklı döngüde üç şey bulunur: (1) başlangıç — sayacı ya da değişkeni kurmak (sayı ← 1); (2) koşul — dönmeye devam edilip edilmeyeceğini her turda kontrol eden soru (sayı ≤ 10); (3) ilerletme — koşulu eninde sonunda bozacak adım (sayı ← sayı + 1). Bu üçünden biri eksikse döngü ya hiç çalışmaz ya da hiç durmaz.

Sonsuz döngü nedir ve nasıl önlenir?

Çıkış koşulu hiç sağlanmayan, dolayısıyla asla bitmeyen döngüdür. En sık nedeni, döngünün içinde sayacı ya da koşulu değiştiren adımı unutmaktır; koşul hep doğru kaldığı için program sonsuza kadar döner. Önlemek için her turda kontrol ettiğin koşulu eninde sonunda bozan bir adım olduğundan emin ol ve döngüyü kâğıtta birkaç tur elle çalıştır.

İç içe döngü (nested loop) nedir?

Bir döngünün gövdesine başka bir döngü koymaktır. Dış döngü her bir tur attığında, iç döngü baştan sona tam olarak çalışır; böylece toplam tur sayısı ikisinin çarpımı olur. Satır-sütun düzeni, çarpım tablosu ya da bir ızgarayı gezmek gibi iki boyutlu işlerde kullanılır. İç döngünün sayacını her dış turda yeniden başlatmayı unutmamak gerekir.

Döngüyle bir toplamı ya da sayıyı nasıl biriktiririz?

Döngüden önce bir biriktirici değişken kurar (toplam ← 0), sonra her turda ona ekleme yaparsın (toplam ← toplam + sayı). Sayacı ilerleten döngü değişkeni ile sonucu biriken biriktirici değişken birbirinden ayrıdır; ikisini karıştırmamak önemlidir. Döngü bitince biriktiricide nihai sonuç durur.

Döngü ile koşul arasındaki ilişki nedir?

Bir döngü, aslında her turun başında sorulan bir koşuldur: "şart hâlâ doğru mu? Öyleyse bir tur daha dön." Yani döngü, bir önceki yazıdaki EĞER kararının tekrar tekrar sorulan hâlidir. Bu yüzden koşulları (karşılaştırma ve VE/VEYA/DEĞİL mantığı) anlamadan döngüleri tam kavramak zordur; döngü, kararın üstüne oturur.