Wie gibt man in c++ die Addition aller Elemente der For-Schleife aus?
Hallo, also folgendes Problem: Die Summe von 1 bis zu einer vom Nutzer eingegebene Zahl soll einmal iterativ und rekursiv ausgegeben werden..
Für die iterative Funktion würde ich eine For-Schleife nehmen, aber wie soll ich das ausdrücken, dass alle Elemente dieser Schleife addiert werden sollen?
Das würde dann etwa so aussehen: func(int a) for(i=1;i<a;i++) {return ? (Summe aller i)}
Wie mache ich das?
4 Antworten
Die Antwort von Youkakun ist denke ich perfekt und beantwortet deine Frage ausreichend.
Hier aber noch mal eine weitere Möglichkeit, wie man eine sog. "Dreieckszahl" etwas cleverer ausrechnen kann:
unsigned sum_tri(unsigned n){
return n * (n + 1) / 2;
}
Diese Methode kommt völlig ohne Schleifen und Rekursion aus!
http://de.wikipedia.org/wiki/Dreieckszahl
Aber wie üblich solltest du bei solchen Spielereien immer auf mögliche Überläufe achten. (am besten nicht mal ansatzweise in die Nähe von INT_MAX kommen) :)
unsigned sum_iter(unsigned n){
unsigned x = 0;
for(unsigned i = 1; i <= n; x += i++);
return x;
}
unsigned sum_rec(unsigned n){
return n > 1 ? n + sum_rec(n-1) : n;
}
erst mal Danke.. leider kommt bei der rekursiven Version ein anderer Wert raus..:( Ich habe versucht, die Gaußsche Summenformel einzubringen, aber das klappt nicht...
Bei der rekursiven sollte aber kein anderer Wert rauskommen. Hier mal ein vollständiger Test:
#include <iostream>
unsigned sum_iter(unsigned n){
unsigned x = 0;
for(unsigned i = 1; i <= n; x += i++);
return x;
}
unsigned sum_rec(unsigned n){
return n > 1 ? n + sum_rec(n-1) : n;
}
unsigned sum_gauss(unsigned n){
return (n*n + n) >> 1;
}
int main(){
for(unsigned i = 0; i < 12; ++i)
std::cout << sum_iter(i) << " == " << sum_rec(i) << " == " << sum_gauss(i) << std::endl;
return 0;
}
Ausgabe:
0 == 0 == 0
1 == 1 == 1
3 == 3 == 3
6 == 6 == 6
10 == 10 == 10
15 == 15 == 15
21 == 21 == 21
28 == 28 == 28
36 == 36 == 36
45 == 45 == 45
55 == 55 == 55
66 == 66 == 66
int func (int a){ int ausgabe,i; i=1; for (i=1,i<=a,i++){ ausgabe=+i; /* es geht natürlich auch ausgabe = ausgabe + i;*/ } return ausgabe; }
funktioniert leider nicht.. Der debugger bemängelt, dass "ausgabe" nicht initalisiert wurde
geht das?:
int func (int a){ int ausgabe,i; i=1; ausgabe = 0; for (i=1,i<=a,i++){ ausgabe=+i; /* es geht natürlich auch ausgabe = ausgabe + i;*/ } return ausgabe; }
ja mit 0 geht es, warum auch immer... danke! ;)
... würde auch mit 1 gehen, weil ausgabe dann initialisiert ist
Du schreibst vor die Vorschleife ein int b; , und in die Vorschleife dann ein b+=i; am ende Returnst du b.
wie soll das funktionieren, wenn b vorher keinen Wert besitzt? Der Debugger bemängelt, dass b nicht initalisiert wurde..
wenn vorher b mit 0 festgelegt wird, funktioniert es... warum auch immer^^
Ich hätte noch so kleinlich sein können, bei sum_iter zu Anfang auf >1 prüfen zu können (sonst return n), sum_iter + sum_gauss zu inlinen & sum_rec zu static und für die Variablen register zu verwenden, um auf jegliche Fehloptimierung des Compilers einzugehen, aber daran denkt man erst später ;)