首页 > 解决方案 > 通过从 n 中减去 2 直到 n = 0 或 1 来确定数字是偶数还是奇数的递归函数

问题描述

零是偶数。

一个是奇怪的。

对于任何其他数 N,其均匀度与 N - 2 相同。

定义一个递归函数 isEven 对应这个描述。该函数应该接受一个参数(一个正整数)并返回一个布尔值。

这是我对 isEven 的实现:

let isEven = function(n){
    even = 0;
    odd = 1;
    if(n == even){
      return true;
    }
    else if (n == odd) {
      return false;
    }
    else{
      n -= 2;
      console.log(n); //Used to see value of n through each call
      isEven(n);
    }
  };

当我调用这个函数时,它返回undefined

  document.write(isEven(50)); //prints `undefined`

的输出console.log(n)如下:

Failed to load resource: net::ERR_FILE_NOT_FOUND
48
46
...
0

我不知道为什么Failed to load resource: net::ERR_FILE_NOT_FOUND是第一个输出,但之后n是打0,为什么是

if(n == even){
          return true;
        }?  

不执行?

标签: javascriptrecursion

解决方案


您需要从递归调用中返回结果。

let isEven = function(n){
    const          // declare local variables/constants
        even = 0,
        odd = 1;
    if(n == even){
      return true;
    }
    else if (n == odd) {
      return false;
    }
    else{
      //n -= 2; no need to reassign a value for a single use
      return isEven(n - 2); // return here
    }
  };

console.log(isEven(50));
console.log(isEven(21));

没有零件的更好的样式else,因为如果之前返回,这不是必需的。

  • 直接使用值,如果只使用一次,
  • 使用严格比较(身份/严格相等运算符===),因为不严格会导致错误的假设
  • 直接计算参数而不为不再使用的变量重新赋值

let isEven = function(n){
        if (n === 0) return true;
        if (n === 1) return false;
        return isEven(n - 2);
    };

console.log(isEven(50));
console.log(isEven(21));


推荐阅读