Управление потоком в цикле while - PullRequest
0 голосов
/ 24 октября 2019

При решении вопроса Project Euler я столкнулся со следующей логической ошибкой, связанной с обновлением n.

while(n<1000):
    #update n
    #do something with n
    #do stuff

vs

while(n<1000):
    #do something with n
    #do stuff
    #update n

InВ первом случае я выполнил операцию с n, хотя условие n <1000 нарушено. </p>

Имеет ли эта логическая ошибка имя? Насколько распространен этот баг?

Я попытался найти его, я нашел кое-что о предварительном увеличении и последующем увеличении переменной. Хотя это близко к ошибке, это не совсем то, что здесь происходит. Я нашел ссылку на это в ответе SO о цикле vs против цикла loop в части, описывающей, как циклы for являются более краткими и прямыми по сравнению с циклами while. По существу, с циклами while мы в конечном итоге запускаем код после обновления переменной, которая может быть похоронена где-то в коде.

1 Ответ

1 голос
/ 24 октября 2019

Это не всегда ошибка: это зависит от алгоритма. В некоторых случаях вы знаете, что исходное значение n допустимо (поэтому вы можете войти в цикл), но вы хотите обновить и использовать новое значение в своей обработке. Вы должны сопоставить свой код с вашим алгоритмом. Ваш второй кодовый блок является каноническим for -эквивалентным и встречается чаще.

Это относится к общему заголовку "ошибка выключена 1".

...