【问题标题】:Recursive function to determine if number is even or odd by subtracting two from n until n = 0 or 1通过从 n 中减去 2 直到 n = 0 或 1 来确定数字是偶数还是奇数的递归函数
【发布时间】:2019-09-29 06:04:56
【问题描述】:

零是偶数。

一个是奇怪的。

对于任何其他数 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 是第一个输出,但之后n0,那么为什么是

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

没有执行?

【问题讨论】:

  • 您的变量 oddeven 是全局变量。您使用 uneccesary 突变,而您可以调用 isEven(n - 2) 并丢弃递归结果,当函数中未返回值时留下结果 undefined。为什么你使用return true 而不仅仅是true

标签: javascript recursion


【解决方案1】:

但不要错过了解mutual recursion的机会!

const isEven = (n = 0) =>
  n === 0
    ? true
    : isOdd (n - 1)

const isOdd = (n = 0) =>
  n === 0
    ? false
    : isEven (n - 1)
    
console .log
  ( isEven (0)  // true
  , isEven (1)  // false
  , isEven (2)  // true
  , isEven (3)  // false
  , isEven (99) // false
  )
  
console .log
  ( isOdd (0)  // false
  , isOdd (1)  // true
  , isOdd (2)  // false
  , isOdd (3)  // true
  , isOdd (99) // true
  )

【讨论】:

  • 如果您想变得更聪明,请将 isOdd 更改为 const isOdd = (n) => !isEven(n)
【解决方案2】:

你需要返回递归调用的结果。

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 部分的更好的样式,因为如果之前返回,这不是必需的。

  • 直接使用值,如果只使用一次,
  • 使用严格比较 (Identity/strict equality operator ===),因为不严格会导致错误假设
  • 直接对参数进行计算,无需为不再使用的变量重新赋值

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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-26
    • 2019-05-25
    • 2020-06-21
    • 2015-07-22
    • 2019-01-06
    • 2019-09-15
    • 1970-01-01
    • 2012-03-22
    相关资源
    最近更新 更多