Я изучаю JavaScript через Eloquent JavaScript, и одним из упражнений является запись рекурсивной функции, isEven
, которая возвращает true, если число четное или false, если число нечетно.
Если я правильно понял, автор специально хотел, чтобы следующее было реализовано:
Но когда я использую код, который у меня ниже, я получаю сообщение об ошибке: InternalError: too much recursion (line 3 in function isEven) …
Как я могу исправить это, все еще используя рекурсивную функцию?
// Your code here.
function isEven(n){
if(n==0){
return true;
}
else if(n==1){
return false;
}
else{
n = n-2;
isEven(n);
}
}
console.log(isEven(50));
// → true
console.log(isEven(75));
// → false
console.log(isEven(-1));
// → ??
Вы можете добавить еще одну проверку, прежде чем декрементировать/увеличить значение.
function isEven(n) {
if (n == 0) {
return true;
}
if (n == 1) {
return false;
}
if (n > 0) {
n = n - 2;
} else {
n = n + 2;
}
return isEven(n);
}
console.log(isEven(50));
console.log(isEven(75));
console.log(isEven(-1));
Для обработки этой рекурсии с этой функцией значение должно быть абсолютным значением.
console.log("isEven");
function isEven(n) {
//Ensure that we look at the numbers absolute value
n = Math.abs(n);
//Do a loop instead of recursion
if (n == 0) {
return true;
} else if (n == 1) {
return false;
} else {
n = n - 2;
return isEven(n);
}
}
console.log(isEven(50));
console.log(isEven(75));
console.log(isEven(-1));
console.log("fasterIsEven");
//A faster way that eliminates recursion
function fasterIsEven(n) {
return n % 2 === 0;
}
console.log(fasterIsEven(50));
console.log(fasterIsEven(75));
console.log(fasterIsEven(-1));
Javascript имеет встроенный метод для проверки того, что что-то делимо с чем-то другим, называемым модулем (%
). Этот метод работает быстрее, но не рекурсивный.
function IsEven(n){ return n%2 === 0 }
Основной код - это один return n%2 === 0
Чтобы увеличить прочность программы, рекомендуется увеличить количество решений без номера.