Wir können ja mal in etwas höhere Informatik vorstossen:
Damit der Loop Fortschritte macht, muss sich der Programmstatus in jeder Iteration ändern. Denn da das Programm ja deterministisch ist, würde bei derselben Eingabe auch dieselbe Ausgabe auftreten. Sobald eine Iteration keine Veränderung mehr vornimmt, bliebe das Programm stecken.
Ok, nun kennt man "Variante" und "Invariante". Die Invariante gibt Regeln an, die am Anfang und Ende jeder Iteration gelten müssen. Meistens ist die Invariante wichtiger als die Variante, da sie für die Korrektheit eines Programmes verwendet wird. Z.B. wäre hier die Invariante, dass zahl1 und zahl2 immer positiv sein müssen (negative Fibonaccizahlen machen ja nicht wirklich Sinn).
Für deine Frage interessanter: Die Variante. Sie bestimmt, welche Variablen garantieren, dass ein Loop in endlicher Zeit beendet. Z.B.
C:
int i = 10;
while(i > 0) {
--i;
}
Hier ist i die Variante: Sie geht nämlich streng monoton nach 0, und dann ist der Loop vorbei. (streng monoton sinkend = die Funktion wird immer kleiner)
Bei dir ist die Variante "max - zahl1 - zahl2". (oder anders geschrieben: max < zahl1 + zahl => loop beendet)
Wenn du ein bisschen darüber nachdenkst, wirst du das sicher sehen
Gruss
cwriter