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:
- 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.
- 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:
- f(2)_A → "4 "
- f(3)_A → "4 7 4 "
- f(4)ün ilk printf → "11 "
- f(3)_B → "4 7 4 "
- 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.