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ß


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

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ß

blackst0rm  12.06.2015, 03:15

Perfekte Antwort.

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.

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.

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ß