0Pricing
C Academy · Ders

Yığın Taşmasını Önleme

Özyinelemeyi sınırlı tutun.

Yığın Taşmasını Önleme, CoddyKit'te ücretsiz bir C Academy dersidir. Bu, 4 dersinin 4. 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, C Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C Academy kursu toplamda 4 dersten oluşur.

Yığın Taşması Nedir

Çağrı yığınının boyutu sınırlıdır. Her işlev çağrısı, parametreler ve yerel değişkenler için yığının bir bölümünü kullanır.

Özyineleme çok derine giderse yığın dolar ve program yığın taşması nedeniyle çöker.

Eksik Temel Durum

En yaygın neden, hiçbir zaman ulaşılamayan bir temel durumdur. Bu, sonsuza kadar sürer ve yığının taşmasına neden olur.

Bu tür bir işlevi çalıştırmayınız; neden başarısız olduğunu inceleyiniz.

int broken(int n) {
    /* no base case: never stops */
    return broken(n + 1);
}

Küçülmeyen Argüman

Bir temel durum olsa bile argümanın ona doğru ilerlemesi gerekir. Burada n arttığı için 0'a hiçbir zaman ulaşamaz.

Her çağrının durma koşuluna yaklaştığını daima denetleyiniz.

int oops(int n) {
    if (n == 0) return 0;
    return oops(n + 1); /* wrong direction */
}

Doğru Sürüm

Yönü düzeltmek işlevin sonlanmasını sağlar. Artık n, temel durum olan 0'a doğru azalır.

#include <stdio.h>

int good(int n) {
    if (n == 0) return 0;
    return n + good(n - 1);
}

int main(void) {
    printf("%d\n", good(10));
    return 0;
}

Derinlik Sınırları Gerçektir

Doğru özyineleme bile çok derinse taşmaya neden olabilir. Bir işlevi milyonlarca düzey derinlikte çağırmak, çoğu zaman yalnızca birkaç megabayt olan yığın boyutunu aşabilir.

Çok büyük derinliklerde yinelemeyi tercih ediniz.

Derin Özyinelemeyi Döngüye Dönüştürme

Özyineleme derinliği girdi boyutuyla birlikte artıyorsa döngüye geçiniz. Böylece binlerce çerçevenin üst üste eklenmesi önlenir.

Aşağıdaki döngü, büyük bir n'e kadar olan toplamı sabit bellekle güvenli biçimde hesaplar.

#include <stdio.h>

int main(void) {
    long total = 0;
    for (int i = 1; i <= 1000000; i++)
        total += i;
    printf("%ld\n", total);
    return 0;
}

Böl ve Yönet ile Derinliği Azaltma

Çalışmayı ikiye bölmek derinliği küçük tutar. Bir aralığı ikiye bölerek toplamak, derinliğin doğrusal değil, boyutun logaritması gibi artmasını sağlar.

long range_sum(int lo, int hi) {
    if (lo == hi) return lo;
    int mid = (lo + hi) / 2;
    return range_sum(lo, mid) + range_sum(mid + 1, hi);
}

Büyük Yerel Dizilere Dikkat

Big yerel değişkenler her çerçeveyi heavy hâle getirir; bu nedenle yığın daha hızlı dolar.

Özyinelemeli bir işlevin içinde büyük diziler tanımlamaktan kaçınınız; bunun yerine işaretçiler geçirin veya öbeği kullanınız.

void heavy(int n) {
    int buffer[10000]; /* big frame each call */
    if (n == 0) return;
    heavy(n - 1);
}

Biriktirici Kullanma

Devam eden toplamı biriktirici olarak geçirmek, her çerçeveyi küçük tutar ve özyinelemeyi kuyruk biçimine getirir.

Böylece bazı derleyiciler tek bir çerçeveyi yeniden kullanabilir.

#include <stdio.h>

long sum_acc(int n, long acc) {
    if (n == 0) return acc;
    return sum_acc(n - 1, acc + n);
}

int main(void) {
    printf("%ld\n", sum_acc(100, 0));
    return 0;
}

Güvenlik Denetim Listesi

Özyinelemeli bir işleve güvenmeden önce şunları denetleyiniz:

1. Bir temel durum var mı?
2. Her çağrı ona doğru ilerliyor mu?
3. Büyük bir girdi için derinlik çok büyük olabilir mi?

Derinlik aşırı artabiliyorsa bunun yerine döngü kullanınız.

Küçük Girdilerle Sınama

Özyinelemeyi daima elle doğrulayabileceğiniz çok küçük girdilerle sınamaya başlayınız.

Küçük durumlar çalışıyor ve derinlik sınırlı kalıyorsa daha büyük ölçeğe güvenle geçebilirsiniz.

Kısa Kontrol

En güvenli düzeltmeyi bulunuz.

Özet

Yığın taşması, özyineleme çok derine gittiğinde veya hiç durmadığında gerçekleşir. Her zaman ulaşılabilir bir temel durum sağlayınız, her çağrıda argümanı küçültünüz, çerçeveleri hafif tutunuz ve derinlik girdi boyutuyla birlikte artabiliyorsa yinelemeye geçiniz.

Sıkça Sorulan Sorular

“Yığın Taşmasını Önleme” dersi ücretsiz mi?

Evet — “Yığın Taşmasını Önleme” 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 C Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C Academy kursu toplamda 4 dersten oluşur.

“Yığın Taşmasını Önleme” dersinde ne öğreneceğim?

Özyinelemeyi sınırlı tutun. C Academy 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.

C Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C Academy, 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 4. dersidir.

“Yığın Taşmasını Önleme” 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 C Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C Academy 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. Özyineleme Nasıl Çalışır
  2. Klasik Özyinelemeli Problemler
  3. Özyineleme ve Yineleme
  4. Yığın Taşmasını Önleme
← C Academy Sayfasına Dön