Вы, похоже, подразумеваете, что этот алгоритм вычисляет сумму, но на самом деле он этого не делает. Вместо этого он будет рассчитывать до n
. Возможно, вы предполагали:
i = 0
s = 0
while i < n:
i = i+1
s = s+i
Обратите внимание, что мы увеличиваем s
на i
, а не на 1
, как в вашей программе.
Предполагая, что это предполагаемая программа, тогда хорошим инвариантом будет:
s
- сумма всех чисел до и включая i
i
- самое большее n
В более программных c нотациях:
s == i*(i+1)/2 && i <= n
Чтобы понять почему, помните, что инвариант должен удерживаться до и после каждой итерации l oop; и когда условие l oop ложно, оно должно подразумевать ваше постусловие. Вот почему вам нужно соединение i <= n
, чтобы при выходе из l oop, s
действительно содержало сумму.