#javascript #function #recursion
#javascript #функция #рекурсия
Вопрос:
В этом коде есть что-то такое, что мне трудно объяснить третьей стороне. Какова логика вычитания 2 из n при рекурсивном вызове нашей функции?
function is_even(n) {
if (n<0) {
return Math.abs(n)
}
if (n=== 0) {
return true;
} else if (n === 1) {
return false;
} else {
return is_even(num - 2);
}
}
console.log(is_even(8));
Комментарии:
1. Он снова запускает функцию с новым аргументом.
2. Он выдает ошибку, потому что num не существует, вот как я бы все равно это объяснил.
3. Также для отрицательного бита, я полагаю, вы хотели сделать ->
return is_even(Math.abs(n))
Ответ №1:
Итак, логика здесь в том, что вы в принципе можете сказать, что что-то нечетное или четное, вычитая из него 2, пока оно не станет 0 или 1.
Вы вычитаете 2, потому что, если вы вычтете что-то еще, вы можете превысить и получить отрицательное число. Вычитая два, вы всегда получите либо 1, либо 0, независимо от того, с какого числа вы начинаете.
Если вы начнете с 9
is_even(9)
9 - 2 = 7 | is_even(7)
7 - 2 = 5 | is_even(5)
5 - 2 = 3 | is_even(3)
3 - 2 = 1 => 1 indicates it is odd and the function will return
Возможно, хорошим способом объяснить третьей стороне было бы написать несколько примеров, подобных приведенным выше.
Ответ №2:
Я думаю, что ваша функция is_even нуждается в некоторой настройке, чтобы работать должным образом:
function is_even(n) {
if (n < 0) {
n = Math.abs(n)
} if (n === 0) {
return true;
} else if (n === 1) {
return false;
}
else {
return is_even(n - 2);
}
}
функция проверяет только две вещи, если это 0, то возвращает True, если это 1, возвращает False .
Если вы являетесь чем-либо, что больше 0 или 1, например, 2,3,4,5,6,7,8,…
Рекурсивный характер оператора else означает: вы всегда можете вычесть 2 раза до любого положительного числа, чтобы оно стало 0 или 1.
Это та же логика, что и при делении любого числа на 2, ваш остаток всегда равен 0 или 1, если оно равно 0, то число четное, если оно равно 1, то число нечетное.
Ответ №3:
Вы продолжаете вычитать 2, пока n не станет 1 или 0. Если оно равно 0, оно четное, а если равно 1, оно нечетное. Вычитая на 2, вы в значительной степени просто находите остаток от n / 2.
function is_even(n) {
if(n<0){
return Math.abs(n)
}
if (n=== 0) {
return true;
}
else if (n === 1) {
return false;
}
else {
return is_even(n - 2);
}
}
console.log(is_even(8));
Ответ №4:
Во-первых, строка должна быть:
return is_even(n - 2);
вместо
return is_even(num - 2);
Переходим к объяснению:
Учитывая число n, функция продолжает вычитание 2 из числа до тех пор, пока остаток не станет отрицательным, 0 или 1. Если число нечетное, то при последующем вычитании 2 оно вернет 1. Если оно четное, то остаток будет равен 0. Если число меньше 2, то остаток будет отрицательным. Смысл повторного вызова функции состоит в том, чтобы продолжать рекурсивно вычитать 2, пока конечное значение не станет либо 0,1, либо отрицательным.
Когда передается отрицательное значение, оно возвращает абсолютное значение вместо определения четного или нечетного.
- На первой итерации -> n = 8 функция вызывается снова.
- На следующей итерации -> n = 6, т.е. (8-2), функция вызывается снова.
- На следующей итерации -> n = 4, т.е. (6-2), функция вызывается снова.
- На следующей итерации -> n = 2, т.е. (4-2), функция вызывается снова.
- На следующей итерации -> n = 0, т.е. (2-2), функция останавливается и возвращает true .
Ответ №5:
is_num — это рекурсивная функция, функция, которая вызывает саму себя во время выполнения. Теперь, когда вы пишете «return is_even(num — 2);», вы отправляете аргумент, который на 2 единицы меньше исходного значения, которое равно num . после возврата is_even(num — 2);… is_even будет вызван снова, но значение параметра n будет меньше на 2 единицы.
Значение n будет продолжать уменьшаться, и рекурсия будет продолжаться до тех пор, пока что-то не будет возвращено, и это возвращаемое значение будет получено в строке, которая вызвала его в первую очередь.
для получения дополнительной информации вы можете обратиться по этой ссылке