int f(int x)
{
if(x==0) return 1;
else if (x==1) return 3;
else
{
printf("%d ", f(x-2) + f(x-1));
return f(x-1) + f(x-2);
}
}
void main()
{
f(4)
}
Cevap : 4 474 11 474 4
Arkadaşlar ben bu koddaki cevaba bir türlü ulaşamadım.
Şimdi koddaki akışa göre
f(0) = 1
f(1) = 3
f(2) = 4
f(3) = 7
f(4) = 11
Bu sonuçlara ulaşabiliyorum ama asla cevap neden böyle çıktı anlayamadım.
Var mı anlatabilecek olan? Teşekkürler.
Bu Kodu Anlayabilen var mı acaba?
11
●276
- 22-02-2025, 20:08:27Anlamadığınız bölüm neresi hocam? Üstte fonksiyon tanımı yapılmış altta da çalıştırılmış. Sizden f(4) ün çıktısı isteniyor. Fonksiyonun return ettiği değer her zaman yazdırılmıyor printfdeki bölüm önemli. Yani biraz iç içe döngü söz konusu.
- 22-02-2025, 20:10:17Hocam anlamadığım bölüm bu cevaba f(4) ile nasıl ulaşmış. Ben ulaşamadım. Cevap : 4 474 11 474 4sacilannurlar adlı üyeden alıntı: mesajı görüntüle
- 22-02-2025, 20:11:35İşte yanlış cevap bu hocam.yazarbey adlı üyeden alıntı: mesajı görüntüle
Cevap : 4 474 11 474 4 - 22-02-2025, 20:14:56Kodun ç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:Hygge adlı üyeden alıntı: mesajı görüntüle
- 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.
- Önce: printf("%d ", f(1)+f(2)); yapılır.
Ş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.
- f(2) (ilk çağrı, f(2)_A):
- 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.)
- f(3) (ikinci çağrı, f(3)_B):
- 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 "
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. - 22-02-2025, 20:16:27Hocam detaylıca adım adım özetlettirdim chatgptye. iç içe fonksiyonlar biraz karmaşıktır. sakin kafayla satır satır kendiniz de yapabilirsiniz. mantığını kavrayınca daha kolay olur.Hygge adlı üyeden alıntı: mesajı görüntüle
- 22-02-2025, 20:16:50bu arkadaşın dediği doğru. ama eksik.yazarbey adlı üyeden alıntı: mesajı görüntüle
f3 yazılırken önceki sonuçlar birleştiriliyor ve f3: 474 şeklinde oluyor. 7 olarak değil. - 22-02-2025, 20:18:07Hocam şimdi anladım. Çok teşekkür ederim. Varolasın.sacilannurlar adlı üyeden alıntı: mesajı görüntüle