Şimdi Ara

C++ fonksiyonunu recursive/özyinelemeli tarzda çevirmek (2. sayfa)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
60
Cevap
0
Favori
2.605
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: önceki 123
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • seyfi84 S kullanıcısına yanıt
    Okey :) O zaman biraz daha zor bir soru.

    Bir veri setindeki tüm alt setleri hiçbir döngü / iterasyon kullanmadan sadece özyineleme / recursive fonksiyon kullanarak çıkarınız. Örneğin veri seti [A B C] ise tüm alt setler:
    quote:

    [ [A B C], [A B], [A C], A, [B C], B, C, HİÇ ]


    Not: "HİÇ" te bir set sayılıyor.



    < Bu mesaj bu kişi tarafından değiştirildi Tuğkan-0153 -- 28 Haziran 2019; 14:2:27 >
  • Kombinasyon sorusu, ben sıkıldım hep aynı şey, isteyen başkası yapsın. Fakat recursion kulağı tersten göstermek değildir, aksine daha temiz net kısa kod yazmak içindir. Sen olayı anlamamışsın, iteratif çözümün daha uygun olduğu problemleri de illa recursion ile çözmeye çalışıyorsun. Önceki örnekteki çözümün de çorba gibiydi, şu 3 parametre geçerek yapmaya çalıştığın.
  • seyfi84 S kullanıcısına yanıt
    3. parametre toplam verisi için gerekli orada. Çözüm çorba gibi değil, commentlerin de olduğunu hesaba at.

    Recursion bazı YZ algoritmalarında kullanılıyor; ona hazırlık olarak egzersiz olarak bu sorular zaten ilerde olayı YZ konusuna bağlamaya calışacağım (vakit ve şartlar uygun olursa)

    Kombinasyon sorusunu polinom faktöryel den biraz daha zor olsun diye ekledim. Fakat onun rekursif çözümü son derece kısa. İteratif çözümünü hiç yapmadım, fakat yapılsa rekursiften daha uzun ve karışık olur diye tahmin ederim.
  • ilk soru için iki örnek


    void iterasyon(int numara, int kere)
    {
    if(kere == 0) return;
    int toplam = (((numara * numara) / 2 ) + numara / 2) + numara % 2;
    cout << toplam << endl;
    iterasyon(toplam, --kere);
    }
    //-------------
    void iterasyon2(int numara, int kere)
    {
    if(kere == 0) return;
    int toplam = 0;
    for(int i=1; i<=numara;++i)
    {
    toplam += i;
    cout << i << (numara == i ? " = " : " + ");
    }
    cout << toplam << endl;
    iterasyon2(toplam, --kere);
    }
    int main()
    {

    iterasyon(5,3);
    cout << "------------" << endl;
    iterasyon2(5,3);
    }
  • Communist kullanıcısına yanıt
    Güzel fakat bu problem zaten çözüldü. Bir tek 3'lü makro (numara == i ? " = " : " + ") güzel bir değişiklik. Kombinasyon sorusunu çözebilir misiniz?
  • quote:

    Orijinalden alıntı: Tuğkan-0153

    Güzel fakat bu problem zaten çözüldü. Bir tek 3'lü makro (numara == i ? " = " : " + ") güzel bir değişiklik. Kombinasyon sorusunu çözebilir misiniz?
    100 lira ateşlersen çözerim
  • Communist kullanıcısına yanıt
    Konuyu ödev için soru soranlarla karıştırdın. Bu konudaki amaç recursion alıştırması yaparak yapay zeka uygulamalarına bağlantı yapmak. Sözkonusu kombinasyon sorusunu hem iterasyon hem de özyineleme ile çözdüm yoksa :) başkaları nasıl çözecek onu görmek ve tartışmak için.
  • anladım hocam şaka yaptım zaten :) özel değilse üzerinde çalıştığın yapay zeka hakkında bilgi verirmisin?
  • YZ deyince akla etkileyici şeyler geliyor fakat değil. Örneğin sığ öncelikli arama / breadth first search / bfs algoritması kullanarak bir çizge / graph 'ta bir başlangıç düğümünden hedef düğüme en kısa patikayı bulmak. Bunu iterasyon ile çözmek yerine recursion ile çözüm geliştirmek YZ konularını daha iyi anlamayı sağlıyor. Yani YZ konularını anlamak üzere egzersiz konuları bunlar. Bir dizinin alt küme / kombinasyonlarını iterasyonla veya recursion'la bulmak dahi YZ alıştırması.

    Asıl amaç YZ konularını öğrenmeden önce recursion ile problem çözerek ve algoritma implementasyonu yaparak egzersiz yapmak.
  • Şimdiye vakit bulabildim. malum ne zaman zinde olmak meselesi..

    #include <iostream>
    #include <clocale>
    using namespace std;

    int abc (int *isayi);

    int main(){
    setlocale(LC_ALL,"tr_TR.utf8");
    setlocale(LC_ALL,"tr_TR.oem857");
    int isayi,dsayi;
    cout<<"Ne kadar sayı hesaplansın?:";
    cin>>isayi;
    cout<<"Kaç devir dönsün?:";
    cin>>dsayi;

    //cout<<isayi;
    for(int i=1;i<=dsayi;++i) abc(&isayi);

    }

    int abc (int *isayi)
    {
    int y=0;
    for (int x=0;x<=*isayi;x++)
    {
    y=x+y;
    cout <<x ;
    x == *isayi ? cout << " = "<<y <<endl: cout << " + ";


    }
    *isayi=y;
    return *isayi;
    }

    /*
    0 + 1 + 2 = 3
    0 + 1 + 2 + 3 = 6
    0 + 1 + 2 + 3 + 4 + 5 + 6 = 21
    ---
    0 + 1 + 2 + 3 + 4 + 5 + 6 = 21
    0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 = 231
    */

    //mobile.donanimhaber.com olarak url'yi değiştir. eğer kodlar düzgün görünmez ise..

    haberdar et derken vonderplanitz olarak tam 5 tane isim çıkıyor 2 3 ne kadar varsa ekleniyor sonra tek kişi görünüyor :) @vonderplanitz
    birde senin codelarını while ile yaptım.



    < Bu mesaj bu kişi tarafından değiştirildi berce -- 30 Temmuz 2019; 8:48:14 >




  • #include <iostream>
    #include <string>
    using namespace std;

    int main () {
    setlocale(LC_ALL,"tr_TR.utf8");
    setlocale(LC_ALL,"tr_TR.oem857");
    int hnumber,total;
    int tnumber;
    int x=1;
    cout<<"Ardışık sayı miktarını gir:";
    cin >>hnumber;
    cout<<"Devir sayısını gir:";
    cin >>tnumber;


    while (x<=tnumber)
    {
    int i=0;
    do
    {

    cout << i;
    total+=i;
    i == hnumber ? cout << " = "<<total<<endl : cout << " + ";
    i++;

    }
    while (i <=hnumber);
    hnumber=total; total=0;
    x++;
    }


    }

    cpp.sh
    C++ Shell
    http://cpp.sh/33sqe



    buda while ile olanı;@vonderplanitz @vonderplanitz




  • berce B kullanıcısına yanıt
    Senin kod rekürsif değil, iteratif. Ayrıca abc fonksiyonu açmak gereksiz. Kullanıcıdan veri alma rutinlerini hariç tutup "3 rakam 3 kez işlenecek" şekilde verileri sabit şekilde koda gömersen daha iyi olurdu cunku kodun amacı ana işlemi göstermek. Sonuçta kod gereksiz yere uzun.

    Kodu rekürsif hale getirmenin amacı ise, kodlama becerisini geliştirmekten cok, YZ çözümlerinde bir strateji geliştirmek için, aslında. yukardai gönderimden alıntı ile:
    quote:

    (Yapay Zeka konularında önemli yeri olan) sığ öncelikli arama / breadth first search / bfs algoritması kullanarak bir çizge / graph 'ta bir başlangıç düğümünden hedef düğüme en kısa patikayı bulmak. Bunu iterasyon ile çözmek yerine recursion ile çözüm geliştirmek YZ konularını daha iyi anlamayı sağlıyor.




  • quote:

    Orijinalden alıntı: Tuğkan-0153

    Soru Hackerrank vs den değil. Çok kalite bir soru değil fakat cok kötü bir soru da değil. Amaç recursive programlamaya ısınmak ki onun da nihai amacı yapay zeka/YZ uygulamalarında kullanılan bazı algoritmalara yatkınlık kazanmak. 1-2 alıştırma sorusu daha sorduktan sonra olayı YZ algoritmalarına bağlamayı düşünüyorum (vaktim ve şartlar uygun olursa)

    Şimdi şöyle bir alıştırma sorusu var:

    Polinom Faktöryel

    C++ fonksiyonunu recursive/özyinelemeli tarzda çevirmek

    (m¿ deki ters soru işareti polinom faktöryelin temsili simgesi. Normal faktöryel gösterimi m! ise polinom faktöryel gösterimi m¿ Bunun haricinde bir anlamı yok)

    m=5 için örnek çıktı:

    quote:

    (5 + 0^2) x (4 + 1^2) x (3 + 2^2) x (2 + 3^2) x (1 + 4^2) = 32725


    Bu soruyu özyinelemeli olarak çözünüz. Ben çözdüm :)
    //öz yineleme iterasyona pek benzemedi gibi?
    ama soruyu çözdüm :)
    #include <iostream>
    #include <clocale>
    using namespace std;

    int main () {
    int toplam=0,sayi1;
    int toplam2=1;
    setlocale(LC_ALL,"tr_TR.utf8");
    setlocale(LC_ALL,"tr_TR.ibm857");
    cout<<"Kac sayi hesaplansin?:"<<" ";
    cin>>sayi1;
    for (int y=0;y<sayi1;y++)
    {
    toplam=((sayi1)-y);
    cout<<y<<"-->"<<toplam<<" ";
    toplam+=(y*y);
    //toplam2+=toplam;
    toplam2*=toplam;
    cout<<toplam<<endl;

    }
    cout<<"formul toplam:"<<toplam2;
    }



    //(5 + 0^2) x (4 + 1^2) x (3 + 2^2) x (2 + 3^2) x (1 + 4^2) = 32725

    /*
    Kac sayi hesaplansin?: 5
    0-->5 5
    1-->4 5
    2-->3 7
    3-->2 11
    4-->1 17
    formul toplam:32725
    */

    /*
    Kac sayi hesaplansin?: 4
    0-->4 4
    1-->3 4
    2-->2 6
    3-->1 10
    formul toplam:960
    */

    hiç yazmıyorsun da.. :)
    başka böyle pratikler varsa çözmek isterim.
    şu zor soru dediğin şey mantığını biraz daha açar mısın?
    ----
    şimdi düzeltim. Bakabilirsin. @vonderplanitz
    yine bir sorun varsa gece bakarım. eğer sohbete cevap verir isen oradanda yazarım.



    < Bu mesaj bu kişi tarafından değiştirildi berce -- 30 Temmuz 2019; 15:52:37 >




  • bu gönderdiklerim iteratif iterasyon olmuş ise de, birde rekürsif yazmayı denerim.
    abc fonksiyonun yazmamın sebebi fonksiyon içinde bir variable değerini nasıl alınabileceğini göstermek istedim. aslında dışarıya variable değerini vermiyor. o yüzden yazdım.
    Bana uzun gelmedi ki senin yazdığın uzunluğu eş değer.

    rekürsif kodları daha sonraya planladım. yaptığımda yayınlarım.

    [Abc] [ab]c a[bc] gibi dizilimi olan sorun için rekürsif kod örneği göstererir misin?



    < Bu mesaj bu kişi tarafından değiştirildi berce -- 30 Temmuz 2019; 14:30:46 >
  • berce B kullanıcısına yanıt
    Çözüm öz yinelemeli değil, iterasyonlu. "for" olan her çözüm iterasyondur. Öz yinelemeli çözümde for olmaz. Öz yineleme => Recursion. Daha fazla açıklama için bak:
    en.wikipedia.org
    Recursion (computer science) - Wikipedia
    https://en.wikipedia.org/wiki/Recursion_(computer_science)


    ve iterasyonlu çözüm hem eksik hem hatalı. Eksik cunku polinom faktöryelin her bir elemanın açılımını (yani örneğin (4 + 1^2) gibi) ekrana tek tek basmıyor, onun yerine örneğin (4 + 1^2)'in sonucu olan 5'i basıyor. ve hatalı cunku polinomdaki ifadeyi doğru hesaplamıyor.




  • Zaten bende onu düşünüyordum. döngü olayını while, for olmadan nasıl yapabilirim diye düşünüyordum.

    Kontrol etmiştim, sayıları kağıtta hesaplayıp bakmıştım tekrar yaparım.

    ekleme:
    kusura bakma! afv edersin! yine doğru hesaplayıp dikkatimden kaçınca kodlamada hata yapmışım. onu düzeltirim.



    < Bu mesaj bu kişi tarafından değiştirildi berce -- 30 Temmuz 2019; 14:45:18 >
  • for içinde birden fazla cout olunca ekranda gösterilen veriler birbirine karışıyor.

    for içinde satır satır göstermeyi nasıl yapazacağız?
    bazıları asd, asd,asd ,asd
    abc,abc,abc
    olarak bir alt satırda gösterilmesini nasıl sağlayabiliriz?
    endl kullanmak çözüm sağlamıyor. yada virgülde koysamda olmuyor.
  • recursive tekrarlanan arasındaki farkı anlamak için bir kaç kod yazmayı deneyeceğim. aklıma her seferinde for'un yaptığı işlevi nasıl yaptırabilirim ve bu return ile olabilir ama nasıl sorusu geliyor?
    bir function içinde tanımayacağım ve function ile bunun bana getirisi ne?

    evet daha kısa yazarak c++ sınırları zorlanabilir? bir münazara niyeti ile yapılabilir?

    ama bilgisayarda daha hızlı çalışmasını sağlamak gibi bir faydası yoksa,çoğu insan buna yeltenmeyecektir. fakat benim her zaman merakımı çeker!

    bir şeyler buldum, belki(katiyyen) birillerinin ihtiyacını karşılar.

    www.programiz.com
    C++ Recursion - Recursive Function
    https://www.programiz.com/cpp-programming/recursion

    https://beginnersbook.com/2017/08/cpp-recursion/
    http://bilgisayarkavramlari.sadievrenseker.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/

    düşündüğüm gibi return ile yapılıyormuş.
    fakat bunun forla pek bir farklı kalmamış gibi görünüyor.

    artısını büyük boyutlu projeler ile çalıştığımızda görürüz.




  • berce B kullanıcısına yanıt
    for'a takıldın. özyineleme recursion yerine Türkçe sözcük kullanma isteğimin sonucu. Vurgu için şimdilik recursion sözcüğünü kullanacağım. Recursion'u C++ ile öğrenmek cok iyi fikir değil. Recursion bir bilgisayar bilimi konusu. Amacı da bazı problemleri daha iyi ifade etmek. O yüzden recursion 'u öğrenmek istiyorsan önce bir betik dil öğrenmelisin. C ve C++, bilgisayar bilimi konularını çalışmak için değil, Unix 'i çalışmak için ideal bir dildir. Okey, C++ bu kısıtlamanın ötesinde hemen herşeyi çalışmak için kullanılabilir fakat C++11 ile. Ancak sen hala eski C++'ı kullanuıyorsun. C++11'de yeni bir çok gelişmiş ve pratik özellikler eklendi. bir betik dil öğrenmem diyorsan bari o yeni C++ özelliklerini öğren. C++11'deki o özellikler 2011 'de standartlaştırıldı fakat coğo 1998'den bu yana dile dahildi. Herbert Schildt'in kitabının 2. yarısı onları anlatıyor.

    Konu başlığı seni yanıltmasın: Bu konu, temel programlama bilgisini geliştirme açısından uygun bir konu değil. C++ fonksiyonunu recursive/özyinelemeli tarzda çevirmek için C++ 'ı sular seller gibi bilmek gerekli ve kesin şart olmasa da üstüne bir de betik dil bilmek gerekli. Sen C++ 'ı tam bilmiyorsun. Betik dil de bilmiyorsun veya belki biliyorsan da hiç kullanmıyorsun. O yüzden recursion konusu ilgini cektiyse yapman gereken önce C++ veya bir betik dil biraz daha çalışıp recursion 'a odaklanmak ve takıldığın yer olursa yeni bir konu başlığı açarak orada soru sormak.

    Şimdi recursion 'a ilişkin bir örnek SS gönderiyorum fakat bu konuda sorun olursa önce geniş bir araştırma yap, çalış, dene ve yine olmuyorsa yeni bir konu aç:

    Altta Fibonacci dizisini recursion ile çıkaran bir Scheme kodu ve çalışma anı görülüyor. Scheme recursion 'u anlamak açısından cok elverişli bir dildir. Burada gördüğün kodun yaptığı işin aynısını C++ ile de yapabilirsin fakat C++11'deki list veri yapısı ile. Temel C++ ile olacak şey değil.
    C++ fonksiyonunu recursive/özyinelemeli tarzda çevirmek




  • 
Sayfa: önceki 123
Sayfaya Git
Git
sonraki
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.