• 22-02-2025, 20:01:20
    #1
    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.
  • 22-02-2025, 20:08:27
    #2
    Anlamadığı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:17
    #3
    sacilannurlar adlı üyeden alıntı: mesajı görüntüle
    Anlamadığı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.
    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
  • 22-02-2025, 20:10:56
    #4
    f(4) çağrıldığında önce f(2) ve f(3) hesaplanıyor.
    f(2) = f(0) + f(1) = 1 + 3 = 4.
    f(3) = f(1) + f(2) = 3 + 4 = 7.
    f(4) = f(2) + f(3) = 4 + 7 = 11.
  • 22-02-2025, 20:11:35
    #5
    yazarbey adlı üyeden alıntı: mesajı görüntüle
    f(4) çağrıldığında önce f(2) ve f(3) hesaplanıyor.
    f(2) = f(0) + f(1) = 1 + 3 = 4.
    f(3) = f(1) + f(2) = 3 + 4 = 7.
    f(4) = f(2) + f(3) = 4 + 7 = 11.
    İşte yanlış cevap bu hocam.
    Cevap : 4 474 11 474 4
  • 22-02-2025, 20:14:56
    #6
    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.
  • 22-02-2025, 20:16:27
    #7
    Hygge adlı üyeden alıntı: mesajı görüntüle
    İşte yanlış cevap bu hocam.
    Cevap : 4 474 11 474 4
    Hocam 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.
  • 22-02-2025, 20:16:50
    #8
    yazarbey adlı üyeden alıntı: mesajı görüntüle
    f(4) çağrıldığında önce f(2) ve f(3) hesaplanıyor.
    f(2) = f(0) + f(1) = 1 + 3 = 4.
    f(3) = f(1) + f(2) = 3 + 4 = 7.
    f(4) = f(2) + f(3) = 4 + 7 = 11.
    bu arkadaşın dediği doğru. ama eksik.
    f3 yazılırken önceki sonuçlar birleştiriliyor ve f3: 474 şeklinde oluyor. 7 olarak değil.
  • 22-02-2025, 20:18:07
    #9
    sacilannurlar adlı üyeden alıntı: mesajı görüntüle
    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.
    Hocam şimdi anladım. Çok teşekkür ederim. Varolasın.