C-rekürsif (özyineleme) fonksiyonları nasıl işliyor?

  • Konuyu başlatan soon
  • Başlangıç Tarihi
  • Mesaj 9
  • Görüntüleme 1B

soon

Hectopat
Katılım
16 Şubat 2021
Mesajlar
542
Çözümler
2
Şu fonksiyonu açıklayacak birine ihtiyacım var , "lifo" prensibiyle işliyor fakat fonksiyonun içindeki birden fazla return yapısı kafamı karıştırıyor.
 
Son düzenleme:
Recursive dediğimiz olay fonksiyon'un tanımında fonksiyonun kendisinin çağırılmasıdır.

Lifo dediğimiz şey ise Last In First Out yani son giren ilk çıkar prensibidir.

Sorunun geri kalanını pek anlamadım. Daha açıklayıcı yazarsanız ya da kod örneği bırakırsanız daha sağlıklı anlatabiliriz.
 
Hocam merhaba, cevap için teşekkür ederim.

Direkt bir hocamızın attığı hatalı kod örneğini paylaşayım, hatayı da belirtirseniz güzel olur. Attığım kod örneğinde fonksiyon içerisinde birden fazla return var bunların nasıl çalıştığını anlamıyorum, normalde rekürsif olmayan fonksiyonlar da fonksiyon return yapınca sonlanıyor (En azından böyle biliyorum.) ama rekürsif yapıda bu yok sanırım, fonksiyon kendi içinde bir şeyler yapmaya devam ediyor.

(Çarpım tablosunu yazdıran kod örneği.)
resim_2021-03-03_125302.png
 
Programlamayi bir kenara birak, matematik olarak bak meseleye.

1614767660887.png


Ustteki fonksiyonu tanimlayan fonksiyonu en rahat recursive yazarsin. Matematikte de programlamada da bazi fonksiyonlar tanimlari geregi kendi kendilerini cagirmak durumundadirlar.
Ornegin bilgisayardaki dosya sistemi. ( Tree traversal )

Ayrica recursive konseptine giris genelde fibonacci ile yapilir, ustte verdigim fonksiyon ona ait.
Fibonacci serisini recursive kullanarak ve kullanmayarak yazdiran 2 farkli fonksiyon yazarsan neden recursive kullanilmasi gerektigini anlamis olursun. Sonraki asama da memoization teknigi.

 

Dosya Ekleri

  • 1614767491763.png
    1614767491763.png
    3,4 KB · Görüntüleme: 37
Son düzenleme:
Geç döndüğüm için özür dilerim. Şu şekilde executable haline getirdim.

C:
#include <stdio.h>

int tablo(int x); // fonksiyon prototipi - ayrıca python gibi direk referans yazamazsınız ne döndürdüğü belirtilmeli (int, char, float,double ... vs //

int main()
{
    int x = 1;
    tablo(x);
    return 0; // Çoğu IDE'de bunu belirtmenize gerek yok ama console sırasında hata çıkarmaması için tavsiye edilir //
}

int tablo(int x) // void fonksiyon bir şey döndürmeyeceği için çalışmayacaktır onun yerine int gibi sayı tabanlı bir döndürme tipi belirtilmeli //
{
    int i;

    if(x<11)
    {
        for(i=1;i<11;i++)
        {
            printf("%-3d ",x*i);
        }
        puts("\n"); // Printf'in granülsüzü //
        return tablo(x+1);
    }
    return 1;
}

Anlamadığınız kısım olursa tekrar yazabilirsiniz. Yorum satırlarında belirtmeye çalıştım.

Çıktısı:

1614776606724.png
 
Son düzenleme:
Programlamayi bir kenara birak, matematik olarak bak meseleye.

Eki Görüntüle 904306

Ustteki fonksiyonu tanimlayan fonksiyonu en rahat recursive yazarsin. Matematikte de programlamada da bazi fonksiyonlar tanimlari geregi kendi kendilerini cagirmak durumundadirlar.
Ornegin bilgisayardaki dosya sistemi. ( Tree traversal )

Ayrica recursive konseptine giris genelde fibonacci ile yapilir, ustte verdigim fonksiyon ona ait.
Fibonacci serisini recursive kullanarak ve kullanmayarak yazdiran 2 farkli fonksiyon yazarsan neden recursive kullanilmasi gerektigini anlamis olursun. Sonraki asama da memoization teknigi.

Geç döndüğüm için özür dilerim.

Öncelikle merhaba hocam, yorumunuz için teşekkür ederim.

Recursive mantığını sanırım az çok anladım fakat recursive fonksiyonunu kullanmadan fibonacci serisini yazdıramadım (uzun bir süre uğraşmama rağmen) bunun için yarın tekrar uğraşacağım, umarım aradaki farkı net bir şekilde kavrayabilirim.

Ek olarak recursive fonksiyonu ile yazdığım kodu paylaşıyorum, daha pratik bir çözümü var ise öğrenmek isterim.
resim_2021-03-03_221508.png

Geç döndüğüm için özür dilerim. Şu şekilde executable haline getirdim.

C:
#include <stdio.h>

int tablo(int x); // fonksiyon prototipi - ayrıca python gibi direk referans yazamazsınız ne döndürdüğü belirtilmeli (int, char, float,double ... vs //

int main()
{
    int x = 1;
    tablo(x);
    return 0; // Çoğu IDE'de bunu belirtmenize gerek yok ama console sırasında hata çıkarmaması için tavsiye edilir //
}

int tablo(int x) // void fonksiyon bir şey döndürmeyeceği için çalışmayacaktır onun yerine int gibi sayı tabanlı bir döndürme tipi belirtilmeli //
{
    int i;

    if(x<11)
    {
        for(i=1;i<11;i++)
        {
            printf("%-3d ",x*i);
        }
        puts("\n"); // Printf'in granülsüzü //
        return tablo(x+1);
    }
    return 1;
}

Anlamadığınız kısım olursa tekrar yazabilirsiniz. Yorum satırlarında belirtmeye çalıştım.

Çıktısı:

Eki Görüntüle 904503
Gayet açık hocam, teşekkür ederim. Ek olarak fonksiyonu en başta belirtmekte de hep problem yaşıyordum (Dizi ve matrisleri herhangi bir fonksiyona yollarken hala karıştırıyorum.) onu da ayrıca belirttiğiniz için teşekkür ederim.
 
Son düzenleme:
Bu da recursive olmayan kullanım şekli.

C:
#include <stdio.h>

void fibonacci(long int a);

int main()
{
    fibonacci(20);
    return 0;
}

void fibonacci(long int a)
{
   long int before;
   long int after;
   long int aft; // temp //
   long int counter = 0;

    before = 0;
    after = 1;
    aft = after;

    while(counter<a)
    {
        printf("\n%ld)%ld" ,counter+1, before);
        after = before + after;
        before = aft;
        aft = after;
        counter++;
    }
    printf("\n");
}
 
Bu da recursive olmayan kullanım şekli.

C:
#include <stdio.h>

void fibonacci(long int a);

int main()
{
    fibonacci(20);
    return 0;
}

void fibonacci(long int a)
{
   long int before;
   long int after;
   long int aft; // temp //
   long int counter = 0;

    before = 0;
    after = 1;
    aft = after;

    while(counter <= a)
    {
        printf("\n%ld)%ld" ,counter+1, before);
        after = before + after;
        before = aft;
        aft = after;
        counter++;
    }
    printf("\n");
}
Koda bakmadım, olduğum seviyeki bilgiler ile çözülebilir mi? (sanırım az çok hangi seviyede olduğumu tahmin ediyorsunuzdur. ) çözülebiliyorsa kendim çözmek isterim.
 
C'ye ilk başladığımda yazdığım fonksiyonlardan biriydi. "long int" yerine sadece "int" yazılabilir. Onun dışında biraz araştırma ve de birazda sabır sayesinde çözülemeyecek bir şey değil. Mantığı gayet basit zaten.
 
C'ye ilk başladığımda yazdığım fonksiyonlardan biriydi. "long int" yerine sadece "int" yazılabilir. Onun dışında biraz araştırma ve de birazda sabır sayesinde çözülemeyecek bir şey değil. Mantığı gayet basit zaten.
O halde tekrar uğraşacağım, sanırım ilk programlama deneyimim olduğu için basit problemleri daha karmaşık hale getiriyorum hocam. Tekrardan teşekkür ediyorum ilginiz ve yardımınız için.
 

Geri
Yukarı