JavaScript:太多的递归?

时间:2017-06-06 07:24:11

标签: javascript

我正在通过 Eloquent JavaScript 学习JavaScript,其中一个练习就是编写递归函数isEven,如果数字为偶数则返回true,如果数字为奇数则返回false 。

如果我理解正确,作者特别希望实现以下内容:

  1. 如果数字== 0,那么它是偶数。
  2. 如果数字== 1,则为奇数。
  3. “对于任何数字N,其均匀度与N-2相同”。
  4. 但是当我使用下面的代码时,我收到一个错误: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 个答案:

答案 0 :(得分: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 :(得分: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有一个内置方法来测试某些东西是否可以被其他东西分割,称为模数(%)。这种方法更快,但不是递归的。

答案 2 :(得分:0)

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

核心代码就是这个 return n%2 === 0

为了提高程序的强度,建议增加非数字决策。