C Programlama #19 | Özyineleme: Kendini Çağıran Fonksiyon ve Yığın Taşması
Özyineleme ve Algoritma MaliyetiEğitmen: Dr. Süleyman Burak ÇELİK
5 faktöriyel 120: bunu bir döngüyle de, kendini çağıran bir fonksiyonla da hesaplayabiliriz. On dokuzuncu derste özyinelemeyi, temel durumu ve özyinelemeli adımı görüyor; on dördüncü derste söz verdiğimiz yığın taşmasını gerçekten yaşıyoruz. Önce 5!'i bir döngüyle hesaplıyor, sonra 5! = 5 · 4! gözleminden özyinelemeli tanıma geçiyoruz: 1! = 1 temel durumdur; daha büyük bir sayı için fonksiyon kendini bir eksik sayıyla çağırır. lldb hata ayıklayıcısıyla temel durumda durup bt ile yığına bakıyoruz: faktoriyel(1)'den faktoriyel(5)'e beş çağrı aynı anda yığında, her birinin kendi çerçevesi ve kendi n'si var. finish komutuyla dönüş değerlerini tek tek görüyoruz: 1, 2, 6, 24 ve 120; dönüşler çağrıların ters sırasıyla geliyor. unsigned long long ile 15!'den 21!'e kadar yazdırıyoruz: 20! doğru, 21! için yazılan sayı ise yanlış, çünkü gerçek değer bu türün en büyük değerinin neredeyse üç katı. Son olarak temel durumu unutuyoruz: gcc ve clang -Wall ile sonsuz özyineleme uyarısı veriyor, program yine derleniyor ve çalışınca segmentation fault ile çöküyor. Hata ayıklayıcıda static bir sayaç yaklaşık 130 bin çağrı yapıldığını, iki komşu çağrının adresleri her çağrının 64 baytlık bir çerçeve kapladığını gösteriyor: 130 bin × 64 bayt ≈ 8 MB, yani ulimit -s ile gördüğümüz yığının tamamı. İşte yığın taşması (stack overflow). Ekrandaki her çıktı, kodun gerçekten derlenip çalıştırılmasından geliyor. Bu derste: 1. Döngüyle ve özyinelemeyle 5! = 120 2. Temel durum ve özyinelemeli adım 3. lldb ile yığındaki beş çağrı (bt) ve dönüşler (finish): 1, 2, 6, 24, 120 4. 21! unsigned long long'a sığmaz 5. Temel durum yoksa gerçek yığın taşması: yaklaşık 130 bin çağrı × 64 bayt ≈ 8 MB Bölümler: 0:00 Kendini çağıran fonksiyon 0:15 Faktöriyel ve döngü 0:43 Temel durum ve özyinelemeli adım 1:33 Çağrılar: yığına bakalım 2:11 Dönüşler: 1, 2, 6, 24, 120 2:48 Faktöriyel ne kadar hızlı büyür? 3:24 Temel durumu unutursak 4:05 Neden çöktü? Yığın taşması 4:47 Bugünün dört kuralı 5:17 Sonraki ders: Fibonacci Kaynak kitap: Paul Deitel, Harvey Deitel — C How to Program, 9. baskı (2022), §5.14. Konu sırası ve kavramlar kaynak kitaptan izlenir; anlatım, örnekler ve ekranlar özgündür. Hedef kitle: C'ye yeni başlayan tüm mühendislik ve bilgisayar/yazılım öğrencileri. Ön koşul: C Programlama #01–#18.
Bu videoyu izlemek için Premium üyelik gerekir.