Много раз я путаюсь в этих двух утверждениях, особенно когда пытаюсь решить алгоритм, который требует увеличения счетчика. В этой статье я объясню разницу между ними и приведу пример, когда что использовать.

Алгоритм, который мне нужно решить, состоял в том, чтобы вывести количество шагов, чтобы уменьшить число до нуля. Учитывая неотрицательное целое число num, вернуть количество шагов, чтобы уменьшить его до нуля. Если текущее число четное, вы должны разделить его на 2, в противном случае вы должны вычесть из него 1.

Выше была ошибка, которую я допустил при решении этого алгоритма, вместо ++counter я передал counter++ в рекурсивную функцию, что приводит к неправильному выводу. Давайте посмотрим, почему это ошибка, рассмотрев логику этого простого примера.

Журнал консоли counter++ выведет 0 в строке 2 и выведет 1 в строке 3. Почему это так? Таким образом, счетчик изначально начинается с 0, мой counter++ сначала возвращает значение функции console.log, а затем увеличивает его до 1, поэтому вы получаете 0 в строке 2, а в строке 3 мы re в основном ничего не делает, кроме счетчика console.log, значение которого в настоящее время увеличено до 1.

В строке 5 счетчик увеличивается на 1, затем возвращает значение в функцию console.log, следовательно, вывод равен 2. В строке 6 мы в основном ничего не делаем, кроме счетчика console.log, значение которого в настоящее время равно 2.

Вернемся к проблеме нашего алгоритма, когда num является четным числом, мы делим его на 2, увеличиваем счетчик на 1, хотим увеличить значение, а затем только передаем значение рекурсивной функции numberOfSteps, чтобы отслеживать, сколько раз нужно уменьшить заданное число до 0. Приведенная выше логика алгоритма всегда будет передавать значение 0 рекурсивной функции, потому что текущее значение, равное 0, будет передано функции перед ним. увеличивает значение счетчика.

Теперь, когда вы знаете разницу. Удачного кодирования!