Şimdi Ara

C# fibonacci dizisi oluşturma ile ilgili.

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
19
Cevap
0
Favori
1.023
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Merhabalar. Problem şu (ProjectEuler'den alıntı);

    ""Fibonacci serisinde her sayı, kendisinden önce gelen iki sayının toplamıdır. 1 ve 2 ile başlayan serinin ilk 10 sayısı:

    1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

    Bu serinin dört milyondan küçük tüm çift sayılarının toplamını bulunuz.
    ""

    Benim sormak istediğim şeyse, bu problemi for döngüsü kullanarak nasıl yapabiliriz? While ile yapılıyor bunu biliyorum ama ben for'la yapmak istesem nasıl yapabilirim? Çünkü şu var for'da "i" veya her ne değişken atadıysak onu 1 arttırıyoruz, (i++) burada işte dananın kuyruğu kopuyor.



  • i++ demek zorunda değilsin, şunları da diyebilirsin;
    i = i + 2
    i = i * 6
    i = i + HerhangiBirMethoddanDonenSonuc
    veya for döngüsü hiç bitmesin istersen i = i diyebilirsin. Ki bu da do {} while(true) ile aynı işi yapmış olur. infinite loopa girmesini engellemek için ekstra kontrol yapman gerekir.

    Dolayısı ile while ile yapabildiğin her şeyi for ile de yapabilirsin.



    < Bu mesaj bu kişi tarafından değiştirildi tnrsr -- 2 Eylül 2016; 17:06:33 >
  •  
    void Button5Click(object sender, EventArgs e)
    {
    int num = 0;
    int num2 = 1;
    int fibonacci=0;
    List<int> list = new List<int>();
    for (int i = 0; i < 100; i++) //aslında 33
    {
    if (fibonacci < 4000000)
    {
    list.Add(fibonacci);
    fibonacci = num + num2;
    num = num2;
    num2 = fibonacci;
    }

    }
    int toplam =list.Where(x => x % 2 == 0).Sum();
    label1.Text = toplam.ToString();

    }

  • forda kullansan while de kullansan zaten en sonunda cli da aynı şekle bürünüyor. Mesela



    for(int i=0;i<10;i++)

    {

    //kod

    }



    şununla aynı işi yapıyor gibi.



    int i=0;

    while(i<10)

    {

    //kod

    i++

    }



    Peki neden while yerine for kullanıyoruz? Çünkü for çok daha iyi duruyor ve okunabilirliği arttırıyor. İşleri hızlandırıyor.

    < Bu ileti mini sürüm kullanılarak atıldı >
  • quote:

    Orijinalden alıntı: greencraft

    forda kullansan while de kullansan zaten en sonunda cli da aynı şekle bürünüyor. Mesela

     

    for(int i=0;i<10;i++)

    {

    //kod

    }



    şununla aynı işi yapıyor gibi.

     

    int i=0;

    while(i<10)

    {

    //kod

    i++

    }



    Peki neden while yerine for kullanıyoruz? Çünkü for çok daha iyi duruyor ve okunabilirliği arttırıyor. İşleri hızlandırıyor.

    Hocam çok teşekkür ederim. Hocam şimdi de başka bir problemde takıldım. ProjectEuler'daki 7. problemdeyim. Kendim bir algoritma oluşturdum ama program butona basınca takılıyor acaba nereden hata yaptım anlamadım. Muhtemelen çok uzun süreli bir hesaplamaya girdiği için takılıyor.

    Problem şu; İlk 6 asal asal sayıyı listelersek(2, 3, 5, 7, 11 ve 13) 6. asal sayının 13 olduğunu görürüz.
    10001. asal sayı nedir?

    Kendi kodlarım şu;

     
    private void button1_Click(object sender, EventArgs e)
    {
    int deger = 2000000; //Herhangi bir tahmini değere kadar olan asal sayılar incelenecek
    int k = 0; //asal olup olmadığı kontrol edilecek olan değer

    int asalsayi = 0;

    int d;

    int sayac = 0;

    while (k<deger)
    {
    d = 1;
    for (int i = 2; i < k; i++)
    {
    if (k % i == 0)
    {
    d = 0;
    }
    }
    if (d == 1)
    {
    asalsayi = k;
    sayac++;
    }
    k++;
    }

    if (sayac==10001)
    {
    label1.Text = asalsayi.ToString(); //sayac 10001 olduğunda "k"yı göster
    }
    }




  • Doğrudur. Yazdığın kod arayüz threadında çalıştığı için işlem bitene kadar form yanıt vermiyor. Algoritmaları formda değil consoleda çıktı alıcak şekilde yaz. Belirli bir değere kadar bütün asal sayıları bulmana gerek yok. Ayrıca d=0da sonra break; koyabilirsin diğer bölenleri kontrol etmeye gerek yok. If döngüsünün de while içinde olması lazım. Sen K 2000000 olana kadar asal mı deil mi diye kontrol ediyorsun. Daha sonra sayaç 1001 ise sonucu veriyorsun ama 2000000a kadar 1001den çok daha fazla asal sayı var bu yüzden bi sonuç alamıyorsun. Algoritma Şöyle olabilir.

    int BulunanAsalSayısı=0;//(1000. asal sayıyı bulmaya çalışıyoruz o yüzden gerkeli)
    int SonKontrolEdilenDeğer=1;

    daha sonra

    while(BulunanAsalSayısı!=1000)//1000 tane bulana kadar
    {
    AsalMı(SonKontrolEdilenDeğer)
    {
    //eğer asalsa
    BulunanAsalSayısı++;
    }
    SonKontrolEdilenDeğer+=2;//çift sayılar asal olmayacağındna ötürü
    }
    return SonKontrolEdilenDeğer;//1000. asal sayı


    Yalnız 1000 asal sayıya kadar bütün asal sayıları bulmak bayağı bi işlem gücü gerektirebilir bu yüzden çeşitli yollarla iş yükünü hafifletilebilir ama bu yolla sonuç bulunabilir.



    < Bu mesaj bu kişi tarafından değiştirildi Guest-42B93504E -- 3 Eylül 2016; 18:36:34 >




  • quote:

    Orijinalden alıntı: greencraft

    Doğrudur. Yazdığın kod arayüz threadında çalıştığı için işlem bitene kadar form yanıt vermiyor. Algoritmaları formda değil consoleda çıktı alıcak şekilde yaz. Belirli bir değere kadar bütün asal sayıları bulmana gerek yok. Ayrıca d=0da sonra break; koyabilirsin diğer bölenleri kontrol etmeye gerek yok. If döngüsünün de while içinde olması lazım. Sen K 2000000 olana kadar asal mı deil mi diye kontrol ediyorsun. Daha sonra sayaç 1001 ise sonucu veriyorsun ama 2000000a kadar 1001den çok daha fazla asal sayı var bu yüzden bi sonuç alamıyorsun. Algoritma Şöyle olabilir.

    int BulunanAsalSayısı=0;//(1000. asal sayıyı bulmaya çalışıyoruz o yüzden gerkeli)
    int SonKontrolEdilenDeğer=1;

    daha sonra

    while(BulunanAsalSayısı!=1000)//1000 tane bulana kadar
    {
    AsalMı(SonKontrolEdilenDeğer)
    {
    //eğer asalsa
    BulunanAsalSayısı++;
    }
    SonKontrolEdilenDeğer+=2;//çift sayılar asal olmayacağındna ötürü
    }
    return SonKontrolEdilenDeğer;//1000. asal sayı


    Yalnız 1000 asal sayıya kadar bütün asal sayıları bulmak bayağı bi işlem gücü gerektirebilir bu yüzden çeşitli yollarla iş yükünü hafifletilebilir ama bu yolla sonuç bulunabilir.

    Hocam,

    AsalMı(SonKontrolEdilenDeğer)
    {
    //eğer asalsa
    BulunanAsalSayısı++;
    }


    bu kısmı nasıl kontrol edeceğim. Yani ben kendi kodumda asal mi değil mi diye for döngüsü ile kontrol ediyordum. Yani sizin dediğiniz "sonKontrolEdilenDeğer"i i=2'den başlatıp kendisine kadar sırayla böldürtüp herhangi bir "i"ye bölünüp bölünmediğine bakıyorum. Ama doğru mu yapıyorum yanlış mı bilmiyorum. Ben de durum şöyle;

    while (BulunanAsalSayısı != 10001)
    {
    for (int i = 2; i < SonKontrolEdilenDeğer; i++)
    {
    if (SonKontrolEdilenDeğer % i == 0)
    {
    asalMı=false
    }
    }
    if (asalMı==true)
    {
    BulunanAsalSayısı++;
    }
    SonKontrolEdilenDeğer += 2;
    }


    Bu doğru mu acaba, formda çalışmıyor (daha doğrusu donuyor) ama konsolda denemedim birazdan düzenleyip konsolda da deneyeceğim.

    Bir de burada "SonKontrolEdilenDeğer" neden 1'den başlıyor? 2'den başlatmak daha doğru değil mi, asal sayılar 2'den başlar? Hatta direk 3'ten de başlatabiliriz o 2'yi de sonradan işleme dahil ederiz. 3'ten başlarsak direk 2 arttırabiliriz.



    < Bu mesaj bu kişi tarafından değiştirildi SaplıBardak -- 3 Eylül 2016; 18:48:34 >




  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • internette çok var örnekleri


     

    public static bool asalmı(int sayı)
    {

    for (int i = 2; (i * i) <= sayı; i ++)
    {
    if ((sayı % i) == 0)
    {
    return false;
    }
    }
    return true;
    }

    void Button1Click(object sender, EventArgs e)
    {

    int kaçıncı = 0;

    for (int i = 2; i < int.MaxValue; i++) {
    if (!asalmı(i))
    continue;
    kaçıncı++;
    if (kaçıncı !=10001)
    continue;
    label1.Text = i.ToString();
    break;
    }

    }
  • İşlem gücünü hafifletmek için sayının kökünü alıp ondan daha küçük asal sayılara bölünüp bölünmediğine bakabilirsin. Mesela 59 sayısı kökü yaklaşık 8 dir 7 5 3 2 ye bölünmediğine göre asaldır. Veya 17*19 = 323, kökünü alırsan yaklaşık 18 çıkar ve sayı 17ye bölünüyor asal değil.

    < Bu ileti DH mobil uygulamasından atıldı >
  • .kök, Gökşen'in kod bahsettiğin bir-küçük-kare-kökü algoritmasını veya ona çok yakın birşeyi uyguluyor denedim hızlı şekilde calıştı ancak kodu kendi sistemime uyarlamak için değişken ve fonk isimlerini düzenlemek zorunda kaldım. SaplıBardak kodları konsol uygulaması olarak gönderirsen daha iyi olur, tabi ki daha kolay denenmesini istiyorsan .)

     C# fibonacci dizisi oluşturma ile ilgili.




  • Başlığı okuyup geldim.
    Yazıları okumadım ama belki yardımı dokunur:
    http://www.ardamavi.com/2016/02/algoritma-fibonacci-dizilimi-kodlari.html?m=1

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • quote:

    Orijinalden alıntı: revivo72

    .kök, Gökşen'in kod bahsettiğin bir-küçük-kare-kökü algoritmasını veya ona çok yakın birşeyi uyguluyor denedim hızlı şekilde calıştı ancak kodu kendi sistemime uyarlamak için değişken ve fonk isimlerini düzenlemek zorunda kaldım. SaplıBardak kodları konsol uygulaması olarak gönderirsen daha iyi olur, tabi ki daha kolay denenmesini istiyorsan .)

     C# fibonacci dizisi oluşturma ile ilgili.

    Hocam teşekkür ederim ben bu soruyu geçtim, 10. problemdeyim. 2 milyondan küçük asal sayıların toplamını istiyor. Uzun yoldan çözünce dakikalarca sürüyor hesaplaması. Sizin söylediklerinizi dikkate alıp yeniden daha performanslı hale getirmeye çalışacağım.




  • quote:

    Orijinalden alıntı: SaplıBardak
    Hocam teşekkür ederim ben bu soruyu geçtim, 10. problemdeyim. 2 milyondan küçük asal sayıların toplamını istiyor. Uzun yoldan çözünce dakikalarca sürüyor hesaplaması. Sizin söylediklerinizi dikkate alıp yeniden daha performanslı hale getirmeye çalışacağım.
    Euler de hep öyle problemler var.
    şimdi, euler 4 probleminin çözümünü cok daha kısa ve hızlı yapan bir kod yazmay calışıyorum onu bitirir bitirmez bu bahsettiğim soruya döneceğim.



    < Bu mesaj bu kişi tarafından değiştirildi Tuğkan-0153 -- 27 Haziran 2019; 13:1:44 >
  • quote:

    Orijinalden alıntı: revivo72

    quote:

    Orijinalden alıntı: SaplıBardak
    Hocam teşekkür ederim ben bu soruyu geçtim, 10. problemdeyim. 2 milyondan küçük asal sayıların toplamını istiyor. Uzun yoldan çözünce dakikalarca sürüyor hesaplaması. Sizin söylediklerinizi dikkate alıp yeniden daha performanslı hale getirmeye çalışacağım.

    euler de olmayan fakat euler tarzında bir problem daha var yakında buradan yayınlayacağım. Şimdilik sadece problemin adını vereyim: Salted Factorial. Oradaki "salted" aynen passwordlerin kırılmasını zorlaştıran yöntem gibi faktöryel hesaplamayı zorlaştıran (ancak işlemi saçmalaştıracak kadar da zorlaştırmayan) bir ifade. O problemi ben çözdüm. Ancak çözümü vermeden nasıl çözülür şeklinde sorup yorumları bekleyeceğim .) Tabi ki sonunda kendi çözümümü de ileteceğim hem de 2 farklı dilde.

    şimdi, euler 4 probleminin çözümünü cok daha kısa ve hızlı yapan bir kod yazmay calışıyorum onu bitirir bitirmez bu bahsettiğim salted factorial sorusunu yeni konu olarak acacağım.

    Aslında forumda bu problemlerle ilgili hiç bu tarz bir konu yok. Ben açmayı düşündüm ama üşendim. Milletin birbiriyle direkt hazır kodu vermeden nasıl yapılabilir, mantığı nedir tarzı fikir alışverişinde bulunabileceği bir konu olsa fena olmaz.




  • yine internetten arakladım :)


     

    public static class sayı
    {
    public static bool asalmı(int sayı)
    {
    if ((sayı & 1) == 0)
    {
    return sayı == 2;
    }
    for (int i = 3; (i * i) <= sayı; i += 2)
    {
    if ((sayı % i) == 0)
    {
    return false;
    }
    }
    return sayı != 1;
    }
    }


    void Button2Click(object sender, EventArgs e)
    {
    double toplam = 0;
    for (int i = 2; i < 2000000; i++)
    {
    if (sayı.asalmı(i))
    {

    toplam += i;
    }
    }

    MessageBox.Show(toplam.ToString());
    }

  • quote:

    Orijinalden alıntı: Gökşen PASLI

    yine internetten arakladım :)


     

    public static class sayı
    {
    public static bool asalmı(int sayı)
    {
    if ((sayı & 1) == 0)
    {
    return sayı == 2;
    }
    for (int i = 3; (i * i) <= sayı; i += 2)
    {
    if ((sayı % i) == 0)
    {
    return false;
    }
    }
    return sayı != 1;
    }
    }


    void Button2Click(object sender, EventArgs e)
    {
    double toplam = 0;
    for (int i = 2; i < 2000000; i++)
    {
    if (sayı.asalmı(i))
    {

    toplam += i;
    }
    }

    MessageBox.Show(toplam.ToString());
    }



    Hocam henüz class'ları bilmiyorum, düz yöntemle sizin yaptığınız gibi i<k yerine i*i <=k yaptım ve oldu ama gene performansı düşük "12-13 saniye" sürüyor hesaplaması. Bunu daha nasıl performanslı yapabiliriz?

    Kodumun son hali bu;

     
    int deger = 2000000;
    int k = 3;
    int d;
    long toplam=2;
    while(k<deger)
    {
    d = 1;
    for (int i = 2; i*i<= k; i++)
    {
    if (k%i==0)
    {
    d = 0;
    break;
    }
    }
    if (d==1)
    {
    toplam = toplam + k;
    listBox1.Items.Add(k);
    }
    k++;
    }




  • listboxa ekleme uzun sürebilir toplam bulmada şart değil eklemek

    ayrıca listboxa o şekil eklersen çok uzun sürer

    List<int> list = new List<int>();

    list.Add(i);

    listBox1.DataSource = list;

    şeklinde kullansan daha hızlı olur



    < Bu mesaj bu kişi tarafından değiştirildi Gökşen PASLI -- 5 Eylül 2016; 20:25:10 >
  • quote:

    Orijinalden alıntı: Gökşen PASLI

    listboxa ekleme uzun sürebilir toplam bulmada şart değil eklemek

    ayrıca listboxa o şekil eklersen çok uzun sürer

    List<int> list = new List<int>();

    list.Add(i);

    listBox1.DataSource = list;

    şeklinde kullansan daha hızlı olur

    Listbox'u deneme amacıyla eklemiştim, komple listelemeyi kaldırdım sadece toplamı yazdırdım ve işlem süresi 1 saniyeye indi.

    Şimdi 12. problemde takıldım. Gerçekten Euler'deki problemler insanı uğraştırıyor hocam biliyorum çok soru sordum ama bana bir de şu 12. problem için yardımcı olabilir misiniz yani nerede hata yaptığımı göremiyorum, kodum aşağıda, sizden ricam hazır kod vermek yerine nerelerde hata yaptığımı belirtmeniz. Aşağıdaki kodu hem konsol ve hem form üzerinde denedim ikisinde de bekliyor sadece, sonuç vermiyor.

     
    private void button1_Click(object sender, EventArgs e)
    {
    int n = 1; //sayının kaçıncı sayı olduğunu tutan değişkendir.
    int sayi = 1;
    int bolenSayisi = 0;

    int sayininYarisi=sayi/2;
    do
    {
    n++;
    sayi = (n * (n + 1)) / 2;
    for (int i = 1; i <= sayininYarisi; i++)
    {
    if (sayi%i==0)
    {
    bolenSayisi++;
    }
    }
    bolenSayisi++; //sayının yarısına kadar kontrol ettiğimiz için yarısından sonraki böleni ekleriz, bu da sayının kendisidir.
    if (bolenSayisi != 4)
    {
    bolenSayisi = 0;
    }
    } while (bolenSayisi<=500);
    label1.Text = sayi.ToString();
    }



    < Bu mesaj bu kişi tarafından değiştirildi SaplıBardak -- 6 Eylül 2016; 0:46:07 >




  • Aga siz neden bahsediyorsunuz? Ben hiç bir şey anlamadım.

    (yazılıma yeni başlayan bir arkadaşınız)
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.