В настоящее время я изучаю рекурсии, то есть когда функция вызывает сама себя вместо использования цикла. Рекурсии могут работать вечно и давать сбои, поэтому важно не забывать включать базовый случай или условие, при выполнении которого рекурсия останавливается. В этом сообщении в блоге я буду рассматривать и распаковывать решение проблемы LeetCode. Надеюсь, вы уйдете с лучшим пониманием того, как подходить к этой или другим подобным проблемам в будущем. По мере того, как мой продолжающийся путь становления мастером-разработчиком продолжается, я обнаружил, что внимательное отношение к шаблонам кода имеет огромное значение для достижения моих целей обучения. Я надеюсь, что, делясь своим мыслительным процессом, я смогу передать эту мудрость и другим.
Давайте посмотрим на проблему
«Обратное целое число». Задача: «Дано 32-битное целое число x, вернуть x с перевернутыми цифрами. Если изменение x приводит к тому, что значение выходит за пределы диапазона 32-разрядных целых чисел со знаком, то возвращается 0».
Примеры:
Ввод: x =112
Вывод: 211
Ввод: x = -130
Вывод: -31
Ввод: x = 0< br /> Вывод: 0
Ввод: x = 2147483649 (2 в степени 31 – 1)
Вывод: 0
Итак, разбивая это, чтобы понять вопрос, мы создаем функцию, которая принимает целое число «x» в качестве аргумента. Функция меняет порядок чисел в целом числе на обратный, так что на выходе получается целое число, начинающееся с последней цифры и заканчивающееся первой цифрой «x». Единственное условие состоит в том, что если число больше 2 в степени 31 минус 1 или меньше минус 2 в степени 31, то мы возвращаем 0.
Итак, давайте запишем нашу функцию:
Первое, что мы хотим сделать, это продумать проблему. Напишите, как функция будет выглядеть внутри, используя код sudo, и посмотрите, что нам нужно оттуда. Мы знаем, что хотим, чтобы наше решение было обратным целому числу, поэтому нам нужен способ обратить целое число. Если мы преобразуем целое число в строку, затем используем встроенный строковый метод .split(‘’), затем встроенный метод массива .reverse(), затем мы присоединим обращенный массив с помощью встроенного метода массива .join(‘’), мы позаботимся о большей части кода.
const reverse = (x) => {
const solution = (x+"").split('').reverse().join('')
return solution
};
Следующее, что нам нужно сделать, это настроить условия так, чтобы наше решение не превышало 2 в степени 31 минус один и не опускалось ниже отрицательного значения 2 в степени 31. Мы создадим наше условие непосредственно перед тем, как вернуть наш результат. решение. Мы скажем, что если решение больше 2 в степени 31 минус 1, то мы вернем 0. Это просто оставляет нам еще одну проблему.
const reverse = (x) => {
const solution = (x+"").split('').reverse().join('')
if (solution > 2**31 -1) {
return 0
}
return solution
};
Здорово. У нас есть условие, которое перехватывает наше решение и возвращает 0, если значение выходит за пределы определенного числа, но что, если x равно отрицательному числу? Нам нужно условие, чтобы покрыть наименьшее значение. Для этого я пошел по пути реализации рекурсии. Прежде чем функция get объявит решение, я хочу, чтобы «x» сначала прошел через условие, в котором мы проверяем, меньше ли оно 0, и в этом случае «x» — отрицательное целое число, это условие будет выполнено. Если «x» — отрицательное целое число, мы вернем -1 * reverse(-x).
const reverse = (x) => {
if (x < 0) return -1 * reverse(-x)
const solution = (x+"").split('').reverse().join('')
if (solution > 2**31 -1) {
return 0
}
return solution
};
Как это работает?
Если x — отрицательное число, мы будем рекурсивно вызывать нашу обратную функцию с отрицательным значением x,, которое уже является отрицательным. Поскольку это новое значение является двойным отрицательным, x будет положительным значением, которое затем обходит первое условие, и мы получаем обратное решение.
Итак, если x = -345, вот что происходит:
let x = -345
reverse(x)
//=> -345 < 0 is true
//=> return -1 * reverse(-(-345))
//=> reverse(345)
//=> solution
//"345" => ['3', '4', '5'] => ['5', '4', '3'] => 543
//=> return -1 * solution
//=> -543
И вот у вас есть реализация рекурсии для поиска обратного значения отрицательного целого числа. Я надеюсь, что это было полезно.