Wie stellt man die Gaußsche Summenformel rekursiv in c++ dar?

4 Antworten

Die Summenformel von Gauß ist ein geschlossener Ausdruck für die Summe der ersten n natürlichen Zahlen. Du brauchst, um so einen Ausdruck in einem Programm zu benutzen, keine Rekursion. Allerdings kannst du sehr wohl die Summe eplizit iterativ oder rekursiv-iterativ berechnen:

unsigned int summe_iterativ(unsigned int n)
{
    unsigned int sum = 0;
    for(int i = n; i > 0; i--)
        sum += i;
    return sum;
}
unsigned int summe_rekursiv(unsigned int n)
{
    return n > 1 ? n + summe_rekursiv(n-1) : 1;
}

Gruß

blackst0rm  12.06.2015, 03:15

Perfekte Antwort.

0
Youkakun  12.06.2015, 18:06

summe_rekursiv kann auch 0 erhalten, dann sollte nicht 1 sondern n (0/1) zurückgegeben werden.

i > 0 kann auf i verkürzt werden, denn der Wert 0 gilt bereits als unwahre Aussage und weniger kann es nicht werden.

unsigned alleinstehend gilt nach Standard bereits als int, man kann sich also etwas Schreibarbeit sparen ;)

0
Chroz192  21.06.2015, 15:47
@Youkakun

Der erste Einwand ist wohl berechtigt (man kann jedoch arugmentieren, dass 0 keine natürliche Zahl ist). Das zweite ist kein sauberer Stil, das wirst du in den wenigsten Projekten finden (man studiere hierzu einige C++ Projekte auf github). Bei Punkt drei kannst du mich erst überzeugen, wenn ich das entsprechende ISO/ANSI C++ Paper sehe, wobei ich denke, dass dies a priori nicht gilt.

Gruß

0

Das was du gemacht hast ist ja eben nicht die Rekursionsformel sondern die geschlossene Form. In Rekursion sieht das ganze so aus:

int rekursion(int a)
{
  if(a == 1)
  {
    return 1;
  }
  return (a + rekursion(--a));
}

LG

Youkakun  12.06.2015, 18:18

Und was, wenn ein Wert kleiner 1 übergeben wird? Du erlaubst sogar negative Zahlen und das ganze kann in einer Endlosrekursion enden.

0
Roach5  14.06.2015, 16:19
@Youkakun

Die Gaußsche Summe ist für n<1 undefiniert, somit muss hier nicht auf Fehler überprüft werden, wenn der Programmierer schlau genug ist, nur Werte zu übermitteln die auch mathematisch Sinn ergäben.

0

die formel hat mit rekursion nichts zu tun.

return (a*(a+1)/2); 

genügt vollauf.

Hallo!

... und bei einer Rekursion brauchst du eine Abbruchbedingung

Gruß