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:
Not: "HİÇ" te bir set sayılıyor. |
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. |
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
|
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? |
![]() |
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? |
Ş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. |
#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++; } } http://cpp.sh/33sqe buda while ile olanı;@vonderplanitz @vonderplanitz |
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:
|
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 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? |
Çö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: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. |
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. 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. |
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. < Resime gitmek için tıklayın > |
Bu mesaja 1 cevap geldi. Cevapları Gizle
Bu mesajda bahsedilenler: @vonderplanitz