Я надеюсь, что в длинной ветке комментариев и других ответах выяснилось, что return + 1
эквивалентно return (+1)
, то есть возвращает целое число , положительное . А поскольку после достижения нуля не предпринимать никаких шагов, +1
- неправильный ответ. Аналогично, простой return
функционально эквивалентен return undefined
. Но undefined
- это не число, и вы столкнетесь с проблемами, если позже попытаетесь добавить к нему 1
. Поэтому решение из комментариев или других ответов возвращает правильное количество шагов, которое в этом случае 0
исправит ваш код.
Я хотел бы указать другой способ решения этой проблемы, хотя:
const numberOfSteps = (n) =>
n <= 0
? 0
: 1 + numberOfSteps (n % 2 == 0 ? n / 2 : n - 1)
console .log (numberOfSteps (12))
Здесь есть поверхностные отличия от других решений, таких как использование функции стрелки, использование условного выражения (троичного) вместо if
-статий и использование <= 0
вместо < 0
, чтобы избежать возможных бесконечных циклов на отрицательных числах.
Но принципиальное отличие состоит в том, что этот код имеет только одну рекурсивную ветвь. Я думаю, что это лучшее решение проблемы.
Мы можем думать об этом как о функции, которая отвечает: «Сколько шагов нужно, чтобы достичь 0
из нашего входного числа, если каждый шаг сокращает четные числа в половина и вычитает одно из нечетных? " Хорошо, что логически приводит к базовому случаю (мы уже на 0
), поэтому мы должны вернуть 0
, и к рекурсивному (мы находимся в некотором натуральном числе), так что нужно добавить 1
к общему количеству шагов Требуется из нашей следующей записи.
Делая этот единственный рекурсивный вызов и добавляя его к результату, мы проясним, что делает рекурсия.
Если это неясно, тогда эта альтернатива может покажи, что я имею в виду:
const takeStep = (n) =>
n % 2 == 0 ? n / 2 : n - 1
const numberOfSteps = (n) =>
n <= 0
? 0
: 1 + numberOfSteps (takeStep (n))