Вы увеличиваете offset
на 2
в каждой итерации, поэтому после n
-ой итерации if будет иметь значение 1+2*n
.
Вы добавляете это значение к current_pos
в каждой итерации. итерация. Итак, в первой итерации вы добавляете 1+0*2
к current_pos
, во второй вы добавляете 1+1*2
, в третьей 1+2*2
и т. Д.
Общая сумма добавляется к current_pos
следовательно, к концу m
-ой итерации тела будет сумма 1+2*n
от n=0
до n=m-1
, без учета операции по модулю на мгновение.
Использование линейности сложения эта сумма может быть записана как m + 2 * sum(n for n=0 to m-1)
. Можно показать, что оставшаяся сумма оценивается как m*(m-1)/2
, так что итоговое значение равно
m + 2 * m*(m-1)/2 = m**2
. Таким образом, этот метод делает то же самое, что и использование (current_pos + m**2) % array_.size()
в каждой итерации с m
, равным l oop Счетчик и без изменения current_pos
будет.