Wieso kommt in der Parameterliste der Funktion sigma die Variable i nicht vor? Das hat einen guten Grund: i dient ja nur als Hilfsvariable für das Durchzählen der in die Summe einzusetzenden Werte. Man könnte dafür auch eine beliebige andere Variable nehmen, ohne den Wert der Summe zu verändern. In der Implementierung haben wir dafür willkürlich die lokale Variable i verwendet.

Dass die Laufvariable nicht prinzipiell zur Summe gehört, sondern nur ein Hilfsmittel in der Implementierung ist, zeigt die folgende rekursive Implementierung, die ganz ohne lokale Variablen auskommt:

def sigma(n0, n1, f):
    if n0 > n1:   # Startwert ist schon größer als Endwert!
        return 0
    else:         # Summe der Funktionswerte von Startwert und Rest
        return f(n0) + sigma(n0+1, n1, f)

In Python gibt es mit dieser Variante leider ein technisches Problem: Wegen der begrenzten Rekursionstiefe funktioniert sie nur bei nicht allzu großer Laufweite.
Manche Programmiersprachen erkennen hier, dass der rekursive Funktionsaufruf die letzte Aktion zur Berechnung des Funktionswerts ist, und optimieren ihn weg.

In unserem Beispiel ist f(i) = i, n0 = 1 und n1 = 100.
Damit können wir die gesuchte Summe so berechnen:

def f(i):
    return i
sigma(1, 100, f)

Das ist aber etwas umständlich, dass man erst eine Funktion definieren muss, die man nur einmal benötigt!

Ja, deshalb gibt es auch die Möglichkeit, eine anonyme Funktion zu verwenden:

sigma(1, 100, lambda i:i)

Mit dem Schlüsselwort lambda beginnt man in Python die Definition einer anonymen Funktion. Danach folgen, durch Komma getrennt, die Parameter (hier nur einer) und dann nach einem Doppelpunkt der Funktionswert.

Kleine Übungen zum Summenzeichen

Bitte prüfen Sie Ihr Verständnis des Summenzeichens an den folgenden Beispielen:

\sum_{i=2}^4 {i^2} \quad \quad \sum_{k=-1}^1 {k^4} \quad \quad \sum_{i=1}^{10} 3 \quad \quad \sum_{i=1}^{0} (i+5) \quad \quad

Bevor Sie mathGUIde die Lösungen anzeigen lassen, versuchen Sie es bitte erst selbst!
Als Gedächtnisstütze können Sie die Definition der Funktion sigma noch einmal ins Eingabefenster kopieren.

sigma( 2,  4, lambda i: i^2)
sigma(-1,  1, lambda k: k^4)
sigma( 1, 10, lambda i: 3)
sigma( 1,  0, lambda i: i+5)

Die dritte Summe sieht zwar etwas ungewöhnlich aus, ist aber durchaus korrekt: Im Term hinter dem Summenzeichen kommt die Laufvariable gar nicht vor. Hier wird also zehnmal der konstante Wert 3 aufsummiert.
Auch die vierte Summe ist ungewöhnlich: Der Endwert der Laufvariable ist kleiner als der Anfangswert. Was passiert hier mit der while-Schleife in der Definition von sigma?

Die Gauß'sche Lösung des Problems

Hat Gauß denn wirklich alle 100 Zahlen einzeln addiert?

Bei Kehlmann geht die Anekdote so weiter:

So, sagte Büttner und griff nach dem Stock. Sein Blick fiel auf das Ergebnis, und seine Hand erstarrte. Er fragte, was das solle.

Fünftausendfünfzig.

Was?

Gauß versagte die Stimme, er räusperte sich, er schwitzte. Er wünschte nur, er wäre noch auf seinem Platz und rechnete wie die anderen, die mit gesenktem Kopf dasaßen und taten, als hörten sie nicht zu. Darum sei es doch gegangen, eine Addition aller Zahlen von eins bis hundert. Hundert und eins ergebe hunderteins. Neunundneunzig und zwei ergebe hunderteins. Achtundneunzig und drei ergebe hunderteins. Immer hunderteins. Das könne man fünfzigmal machen. Also fünfzig mal hunderteins. Büttner schwieg. Fünftausendfünfzig, wiederholte Gauß, in der Hoffnung, daß Büttner es ausnahmsweise verstehen würde.

Diese Paarbildung geht auf, weil Hundert eine gerade Zahl ist. Damit es auch für ungerade Zahlen funktioniert, schreiben wir die Summe zweimal auf, einmal vorwärts und einmal rückwärts:

\begin{eqnarray} & 1 & + & 2 & + & 3 & + & \ldots & + &98 & + & 99 & + & 100 \\ = & 100 & + & 99 & + & 98 & + & \ldots & + & 3 & + & 2 & + & 1 \end{eqnarray}
Die Summe von 1 bis 5 lässt sich zweimal in einem 5·6-Rechteck unterbringen.

so ergeben die übereinanderstehenden Zahlen jeweils 101.
Die doppelte Summe ist also 100·101 = 10100 und damit die einfache Summe 5050.

Für allgemeinere Summen von 1 bis n ergibt sich auf diese Weise:

2 \sum_{i=1}^n i = n(n+1)
und damit:
\sum_{i=1}^n i = \frac{n(n+1)}2

Zur Belohnung für unser Nachdenken rechnet mathGUIde uns jetzt mal eben die Summe der natürlichen Zahlen bis 10100 aus. Der Operator // steht für ganzzahlige Division:

n = 10^100
print(n*(n+1) // 2)

Fortsetzung: Summen von Quadratzahlen