Arama butonu
Bu konudaki kullanıcılar: 1 misafir, 1 mobil kullanıcı
57
Cevap
2702
Tıklama
0
Öne Çıkarma
C++ fonksiyonunu recursive/özyinelemeli tarzda çevirmek
T
6 yıl
Yarbay
Konu Sahibi

#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 :)

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil



A
6 yıl
Yarbay

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ı >

T
6 yıl
Yarbay
Konu Sahibi

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.


Bu mesaja 1 cevap geldi.
A
6 yıl
Yarbay

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

https://codebeautify.org/javaviewer/cbd92e17
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ı >


Bu mesajda bahsedilenler: @vonderplanitz
T
6 yıl
Yarbay
Konu Sahibi

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)



A
6 yıl
Yarbay

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ı >

T
6 yıl
Yarbay
Konu Sahibi

Okey fakatpseudo koda gerek bırakmayacak kadar kısa bir problem. Şimdi birşeyler atıştırıyorum, kodları denerim sonra...



B
6 yıl
Yüzbaşı

// 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 :)



T
6 yıl
Yarbay
Konu Sahibi

Ş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 :)




Bu mesajda bahsedilenler: @berce , @alimmm78
B
6 yıl
Yüzbaşı

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 >


Bu mesajda bahsedilenler: @vonderplanitz
B
6 yıl
Yüzbaşı

[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.



B
6 yıl
Yüzbaşı

@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 >
Bu mesaja 1 cevap geldi.
T
6 yıl
Yarbay
Konu Sahibi

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.




Bu mesajda bahsedilenler: @berce
S
6 yıl
Yüzbaşı

  
#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ı >
Bu mesaja 1 cevap geldi.
T
6 yıl
Yarbay
Konu Sahibi

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.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @seyfi84
S
6 yıl
Yüzbaşı


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 >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @vonderplanitz
T
6 yıl
Yarbay
Konu Sahibi

ö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.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @seyfi84
S
6 yıl
Yüzbaşı

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


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @vonderplanitz
T
6 yıl
Yarbay
Konu Sahibi

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

< Resime gitmek için tıklayın >
(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 mesaja 2 cevap geldi.

Bu mesajda bahsedilenler: @seyfi84
S
6 yıl
Yüzbaşı

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))


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @vonderplanitz