Şimdi Ara

C++ fonksiyonunu recursive/özyinelemeli tarzda çevirmek

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
60
Cevap
0
Favori
2.602
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 123
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • #include <iostream> 
    using namespace std;

    /* x ardışık numarayı y kere işle, her bir işlemede bir önceki döngüdeki
    numaraların toplamı kadar numara kullan 5 numarayı 3 kere işleme örneği:
    1+2+3+4+5=15
    1+2+3+4+5++++14+15=120
    1+2+3++++++119+120=7260 */

    void iterasyon (int numara, int kere)
    {
    int toplam=0;
    for (int i=1; i <= kere; i++) {
    for (int n=1; n <= numara; n++) {
    toplam += n;
    cout << n; n != numara ? cout << " + " : cout << "";
    if (n == numara) cout << " = " << toplam << endl;
    }
    numara = toplam; toplam=0;
    }
    }
    int main()
    {
    int numara, kere;
    cout << "kac numara hesaplanacak? " << endl;
    cin >> numara;
    cout << "kac kere hesaplanacak? " << endl;
    cin >> kere;
    iterasyon(numara, kere);
    return 0;
    }

    /*
    Çalışma anı:

    kac numara hesaplanacak?
    5
    kac kere hesaplanacak?
    3
    1 + 2 + 3 + 4 + 5 = 15
    1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 = 120
    1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + 105 + 106 + 107 + 108 + 109 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 120 = 7260
    */


    Özyinelemeli tarzda fonksiyonu yazdım. Başkaları nasıl yazacak, onu tartışma ve egzeersiz amaçlıdır konu. Egzersiz yapmak isteyenler , bu fonksiyonu özyinelemeli tarzda yazabilir mi :)







  • recur(temp,num,kere){
    if(kere==0 ) return;
    if(temp==num){
    Print(num+”=“)
    sum=num*(num+1)/2
    print(sum)
    Println()
    recur(0,sum,kere-1)


    }
    Else{
    Print (temp +”+”)
    Recur(temp+1,num,kere)


    }

    }


    Main(){
    recur(0,num,kere)

    }

    < Bu ileti mini sürüm kullanılarak atıldı >
  • Sağol fakat C++ kodu olsa iyi olur. Ayrıca bu hangi dil? Java diyeceğim sonda noktalı virgül yok. Sonuçta kodu deneyemiyoruz.
  • Pseudocode hocam
    int'leri, noktalı virgülleri vb ekleyince java oluyor, c++ da olur, syntaxları benzer zaten


    dh baştaki boşlukları sildiğinden süslü parantezleri takip edince görünür oluyor


    Burdan bakınca anlaşılır



    < Bu mesaj bu kişi tarafından değiştirildi alimmm78 -- 26 Haziran 2019; 16:8:35 >
    < Bu ileti mini sürüm kullanılarak atıldı >




  • Pseudo kodları deneyemeyiz dolayısıyla tartışamayız. Gerçek kod lazım bize. Benim kodları örneğin g++ 'a gir, hatasız çalışır. Gönderi üstündeki buton panelinde "code" etiketi içine girince kodları indent'ine kadar doğru gösterir; codebeautify.org a gerek yok (kısa kodlar için)
  • onlinegdb.com
    Just a moment...
    https://onlinegdb.com/B1-ree-xS

    Buraya java kodunu koydum, çalışıyor
    Uç noktalar için kontrol yok mesela negatif vb girerse sıkıntı olabilir

    konuda siz nasıl yaparsınız demişsiniz, Pseudocode ile anlatmak en doğrusudur, yoksa gidip tam kod yazmak gereksizlik oluyor ama yine de üstteki linkte yazdım



    < Bu mesaj bu kişi tarafından değiştirildi alimmm78 -- 26 Haziran 2019; 16:21:17 >
    < Bu ileti mini sürüm kullanılarak atıldı >
  • Okey fakatpseudo koda gerek bırakmayacak kadar kısa bir problem. Şimdi birşeyler atıştırıyorum, kodları denerim sonra...
  • // Example program
    #include <iostream>
    #include <string>
    using namespace std;

    int main()
    {
    cout <<" Ardışık Tek Sayılar 9 kere :"<<endl;
    for (int x=1;x<=9;x += 2)
    {
    cout <<"işte sayımız:"<<x<<endl;
    }

    }


    bu kısa bir şey lakin program çıkan sonuca göre yapıyor. döngüyü değil :)
  • Şimdi oldu. Güzel, kod doğru şekilde çalışıyor fakat ufak bir eksik var. Toplam degeri hesaplama için matematik formul kullandın. Onu bir değişken / parametre ile yapsan daha iyi çözüm olurdu.

    @berce O nedir öyle :)
  • bunu benim için söylüyorsan eğer :)

    ben tek yada çift ardışık sayıların sadece iki farkla değiştiğini söylerim.

    2+2=4+2=6+2=8+2=10
    1+2=3+2=5+2=7+2=9

    edit:
    Hep unutuyorum. bilgisayarın sıfırı dahil ettiğini aslında sayma sayısı diye şeyi icad edenin(sen ne anlarsan ama bende küfür yok :))
    +1 fazlasını kullanacaksın.
    Diğerlerini şimdi yapıyorum.
    @vonderplanitz



    < Bu mesaj bu kişi tarafından değiştirildi berce -- 26 Haziran 2019; 17:57:45 >
  • [DHTUBE=for (int x=1;;x += 3)]

    1
    4
    7
    10
    sayılarını elde ediyoruz. fakat sürekli gidiyor bir yerde dur dememiz gerekli :)
    o nasıl olacak?

    böyle olunca senin istedi


    //kocaman code blogunun içinde yazmaya ne gerek var!
    DH ekibi daha güzel BBCODE yapabilirsin. her işe yönelik.
  • @vonderplanitz
    aklımda bir şey var. işte onun için bunları yazdım. For'da istediklerimi tam yapamıyorum.
    Benin istediğin şeyin sadece bir kısmını ancak karşıladı. Böyle onunca daha kısa oluyor. araştırmaya devam.

    Ben biraz daha kitap okuyayım :) Daha sadece yazabilmek için bu gerekli! Hep ingilizceyi okumakta hüsran yaşadığım için zor geliyordu.biraz acıdan zevk alır olmak lazım. :)

           cout << n; n != numara ? cout << " + " : cout << ""; 
    if (n == numara) cout << " = " << toplam << endl;
    }
    numara = toplam; toplam=0;
    }

    yani bu kısım için.



    < Bu mesaj bu kişi tarafından değiştirildi berce -- 26 Haziran 2019; 21:28:29 >
  • berce B kullanıcısına yanıt
    Herbert Schildt - The Complete C++ Reference kitabı kraldır, onu tavsiye ederim. C++ 'ı en tutarlı anlatan kişi o. O kitaptan bakarak bu probleme tekrar bir el at; çözüm bekliyoruz.
  •   
    #include <iostream>
    using namespace std;

    void hesapla(int num, int rep) {
    if (rep == 0) return;

    int sum = 0;
    for (int i=1; i<=num; ++i, cout << "+") {
    cout << i;
    sum += i;
    }
    cout << "=" << sum << endl;

    hesapla(sum, --rep);
    }

    int main() {
    hesapla(5, 3);
    }



    < Bu mesaj bu kişi tarafından değiştirildi seyfi84 -- 27 Haziran 2019; 0:5:41 >
    < Bu ileti mini sürüm kullanılarak atıldı >
  • seyfi84 S kullanıcısına yanıt
    Güzel fakat num iterasyonu da özyineleme tarzı olmalı. Sen sadece rep iterasyonunu özyineleme yaptın. Sorunun amacı zaten her ikisini de özyineleme tarzında yapabilmek. main'i return'sız ve giriş rutini olmadan fonksiyonu 5 ve 3 ile kısaca cağırmak kısa ve güzel durmuş, benim çözümü de aynı sekilde düzenledim.

  • int hesapla2(int num, int rep) {
    if (rep > 1)
    num = hesapla2(num, --rep);

    int sum = 0;
    for (int i=1; i<=num; ++i, cout << "+") {
    cout << i;
    sum += i;
    }
    cout << "=" << sum << endl;
    return sum;
    }

    int main() {
    hesapla2(5, 3);
    }



    < Bu mesaj bu kişi tarafından değiştirildi seyfi84 -- 27 Haziran 2019; 8:19:16 >
  • seyfi84 S kullanıcısına yanıt
    özyinelemeyi numara yerine tekrar (rep) iterasyonuna uyguladın bu sefer. Aynı anda her ikisine özyineleme uygulanmalı. Benim çözüm konuya açıklık katacaktır.

    #include <iostream> 
    using namespace std;
    void yinele (int num, int tekr, int toplam)
    {
    if (num > 0) { // num döngüsü
    cout << num << "+";
    yinele ((num-1), tekr, (toplam + num));
    }
    else {
    cout << " = " << toplam << endl;
    if(tekr == 1) return; // tekr sonu
    else yinele(toplam, (tekr-1), 0) ;
    }
    }
    int main() { // 5 numarayı 3 kez tekrar et
    yinele (5, 3, 0); // başlangıçta toplam 0
    }


    alimmm78'in çözümü de doğru şekilde 2 özyineleme uyguluyordu fakat toplamı mat formülle buluyordu; onu da özyineleme değişkenleri ile bulması daha doğru olurdu cunku o da özyineleme sorusunun bir parçası. Senin kod da toplamı (sum) iterasyon içinde hesapladığın için int sum = 0 şeklinde tanımlamak zorunda kalıyorsun; özyineleme tarzında ona gerek de kalmıyor.

    Bu sorudan sonra kapsamı daha geniş 2 soru daha göndereceğim. Bir sonraki soru sadece özyineleme ile çözülebilecek türde olacak.




  • Bir fonksiyonu iki farklı amaçla ve her ikisinde de recursive kullanmaya çalışıyorsun, biraz zorlama geldi bana. Hackerrank gibi bir yerin sorusu mu bu? oralar "zihni sinir"e kaçıyor biraz
  • seyfi84 S kullanıcısına yanıt
    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 :)




  • Bu daha mantıklı ve kolay, python ile yaptım:


    def pfact(m, n=0):
    if (m - n) == 0:
    return 1
    return (m - n + n**2) * pfact(m, n+1)

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