JavaScript: слишком много рекурсии?

1

Я изучаю JavaScript через Eloquent JavaScript, и одним из упражнений является запись рекурсивной функции, isEven, которая возвращает true, если число четное или false, если число нечетно.

Если я правильно понял, автор специально хотел, чтобы следующее было реализовано:

  1. Если число == 0, то оно четное.
  2. Если число == 1, то оно нечетно.
  3. "Для любого числа N его равномерность равна N-2".

Но когда я использую код, который у меня ниже, я получаю сообщение об ошибке: 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));
// → ??
Теги:

3 ответа

3
Лучший ответ

Вы можете добавить еще одну проверку, прежде чем декрементировать/увеличить значение.

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));
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 имеет встроенный метод для проверки того, что что-то делимо с чем-то другим, называемым модулем (%). Этот метод работает быстрее, но не рекурсивный.

0

function IsEven(n){ return n%2 === 0 }

Основной код - это один return n%2 === 0

Чтобы увеличить прочность программы, рекомендуется увеличить количество решений без номера.

  • 1
    Это больше не рекурсивная функция.
  • 0
    Это должна быть рекурсия, верно? Даже если это неэффективно?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню