İç İçe Döngülerden Çıkma
Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 2 / 68.
İç içe döngülerle çalışırken, normal bir break ifadesi yalnızca en içteki döngüden çıkar. Ancak Go, dış döngülerden doğrudan çıkmanıza olanak tanıyan etiketler (labels) sağlar; bu da size karmaşık döngü yapıları üzerinde hassas kontrol sağlar.
Etiket, bir döngünün önüne yerleştirdiğiniz, ardından iki nokta üst üste gelen bir tanımlayıcıdır. Ardından, iç içe geçmiş döngülerin içinden bile olsa, o belirli döngüden çıkmak için break ve ardından etiket adını kullanabilirsiniz.
outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if i == 1 && j == 1 {
break outer
}
fmt.Printf("i=%d, j=%d\n", i, j)
}
}Bu örnekte, i == 1 && j == 1 koşulu sağlandığında, break outer hem iç hem de dış döngüden anında çıkar. Bu, özellikle aradığınız şeyi bulduğunuzda aramayı tamamen durdurmak istediğiniz 2D veri yapıları içinde arama yaparken yararlıdır.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Görev
KolayBu challenge'da, bir 2D ızgara (grid) içinde arama yaparken iç içe geçmiş döngülerden çıkmak için etiketli (labeled) break ifadelerini kullanma pratiği yapacaksınız. Izgarada belirli bir hedef sayıyı bulmanız ve bulduğunuz anda aramayı hemen durdurmanız gerekiyor.
İki girdi alacaksınız:
- Izgaranın boyutlarını
"rows,cols"formatında temsil eden bir dize (örneğin,"3,4") - Aranacak hedef sayıyı temsil eden bir dize (örneğin,
"7")
Size aşağıdaki 2D sayı ızgarası verilmiştir:
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
}Göreviniz şunlardır:
- Kaç satır ve sütun aranacağını belirlemek için ilk girdiden boyutları ayrıştırın
- İkinci girdiden hedef sayıyı ayrıştırın
- Izgara içinde arama yapmak için etiketli bir
breakile iç içe geçmiş döngüler kullanın - Hedef sayıyı bulduğunuzda,
"Found [target] at position ([row], [col])"yazdırın ve etiketli break kullanarak her iki döngüden de hemen çıkın - Eğer aramayı hedefi bulamadan tamamlarsanız,
"Target [target] not found"yazdırın
Konum, 0 tabanlı indeksleme kullanılarak bildirilmelidir (ilk satır 0, ilk sütun 0'dır).
Kopya kağıdı
Etiketler, iç içe geçmiş döngülerin içinden dış döngülerden çıkmanıza olanak tanır. Bir etiket, bir döngünün önüne yerleştirilen ve ardından iki nokta üst üste gelen bir tanımlayıcıdır.
outer:
for i := 0; i < 3; i++ {
for j := 0; j < 3; j++ {
if condition {
break outer // her iki döngüden de çıkar
}
}
}Derin iç içe yapılardan bile olsa, o belirli döngüden çıkmak için break ve ardından etiket adını kullanın. Bu, 2D verilerde arama yaparken ve hedefinizi bulduğunuzda tamamen durmak istediğinizde kullanışlıdır.
Kendin dene
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Girdiyi oku
var dimensions string
var targetStr string
fmt.Scanln(&dimensions)
fmt.Scanln(&targetStr)
// Boyutları ayrıştır
dimParts := strings.Split(dimensions, ",")
rows, _ := strconv.Atoi(dimParts[0])
cols, _ := strconv.Atoi(dimParts[1])
// Hedef sayıyı ayrıştır
target, _ := strconv.Atoi(targetStr)
// Önceden tanımlanmış ızgara
grid := [][]int{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
}
// TODO: Kodunuzu aşağıya yazın
// Hedefi aramak için etiketli break (labeled break) ile iç içe döngüler kullanın
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Mantık ve Akış bölümündeki tüm dersler
1İleri Seviye Kontrol Akışı
`fallthrough` ile Switchİç İçe Döngülerden ÇıkmaBelirli Bir Döngüye Devam Etme`goto` İfadesiÖzet - İleri Seviye Döngü Kontrolü4Proje: Basit Görev Listesi
Proje KurulumuGörev Ekleme2Structlar ve Metotlar
Structlarda Metot TanımlamaValue Receiver'larPointer Receiver'larReceiver SeçimiMetotlar ve FonksiyonlarÖzet - Struct Davranışı5Derinlemesine Map'ler
Struct Map'leriMap Değeri Olarak Pointer'larNil Map KontrolüMap'leri KarşılaştırmaÖzet - Kelime Frekansı Sayacı3Arayüzler (Temeller)
Arayüz Nedir?Bir Arayüz TanımlamaBir Arayüzü UygulamaArayüz Tiplerini KullanmaBoş ArayüzTip OnaylamalarıTip SeçimiÖzet - Şekiller ve Davranışlar