Hygge adlı üyeden alıntı: mesajı görüntüle
Hocam anlamadığım bölüm bu cevaba f(4) ile nasıl ulaşmış. Ben ulaşamadım. Cevap : 4 474 11 474 4
Kodun çalışma şeklini adım adım incelediğimizde, her recursive çağrı kendi içinde printf ile ara değerler yazdırıyor. Burada her f(x) çağrısı, ilgili şartlara göre:
  • f(0) → 1 (yazdırma yok)
  • f(1) → 3 (yazdırma yok)
  • f(2)
    • Önce: printf("%d ", f(0)+f(1)); → f(0)=1, f(1)=3 hesaplanır, ekrana "4 " yazdırılır.
    • Sonra: return f(1)+f(0); → 3+1 = 4 döndürülür.
  • f(3)
    • Önce: printf("%d ", f(1)+f(2)); yapılır.
      • f(1) → 3,
      • f(2) (yeni çağrı): yukarıdaki gibi "4 " yazdırır ve 4 döndürür.
      • Böylece 3+4 = 7 hesaplanır, ekrana "7 " yazdırılır.
    • Sonra: return f(2)+f(1); yapılır.
      • f(2) (yeni çağrı): yine "4 " yazdırır ve 4 döndürür,
      • f(1) → 3,
      • Toplam 4+3 = 7 döndürülür.
Her f(3) çağrısında; f(2) çağrıları kendi içlerinde "4 " yazdırdığı için, f(3) fonksiyonu çalışırken toplamda "4 7 4 " yazdırılmış olur.
Şimdi f(4) fonksiyonuna bakalım. f(4) da base durum olmadığı için else bloğuna girer:
  1. printf("%d ", f(2) + f(3));
    Bu ifade için:
    • f(2) (ilk çağrı, f(2)_A):
      → "4 " yazdırır, dönen değer: 4.
    • f(3) (ilk çağrı, f(3)_A):
      → f(3) çağrısı içerisinde:
      • İlk olarak, f(1) + f(2) hesaplanırken f(2) (iç çağrı) "4 " yazdırır, ardından "7 " yazdıran printf çalışır.
      • Sonrasında return kısmında f(2) (başka bir çağrı) "4 " yazdırır.
    • Yani f(3)_A çağrısı ekrana "4 7 4 " yazdırır ve 7 döndürür.
    • Böylece f(2)+f(3) = 4+7 = 11 hesaplanır, ve f(4)’ün ilk printf çağrısı "11 " yazdırır.
  2. return f(3) + f(2);
    Bu kısımda f(3) ve f(2) yeniden çağrılır (önceden yapılan çağrılardan bağımsız, her biri tekrar hesaplanır):
    • f(3) (ikinci çağrı, f(3)_B):
      → Yukarıdaki f(3) davranışı tekrar çalışır, ekrana "4 7 4 " yazdırır ve 7 döndürür.
    • f(2) (ikinci çağrı, f(2)_B):
      → "4 " yazdırır, dönen değer: 4.
    • Bu çağrının toplamı: 7+4 = 11. (Ancak bu değer main() içerisinde yazdırılmadığı için ekrana yansımaz.)
Tüm çağrıları varsayılan olarak soldan sağa değerlendirdiğimizi kabul edersek, ekrana basılan çıktı sırasıyla:
  1. f(2)_A → "4 "
  2. f(3)_A → "4 7 4 "
  3. f(4)’ün ilk printf → "11 "
  4. f(3)_B → "4 7 4 "
  5. f(2)_B → "4 "
Böylece ekrana basılan çıktı: 4 4 7 4 11 4 7 4 4
Not: C dilinde fonksiyon argümanlarının değerlendirilme sırası tanımsızdır. Ancak, bu tip sorularda genellikle soldan sağa değerlendirme varsayılır.
Sonuç olarak, kod çalıştırıldığında ekrana yukarıdaki gibi "4 4 7 4 11 4 7 4 4 " çıktısı yazdırılır.