雄辩的JavaScript 2nd Edition递归练习解决方案

Eloquent JavaScript 2nd Edition recursion exercise solution

本文关键字:递归 练习 解决方案 Edition 2nd JavaScript      更新时间:2023-09-26

我试图解决在线书籍eloquentjavascript 2nd edition的递归练习:

以下是问题陈述的内容:

我们已经看到 %(余数运算符(可用于测试是否 通过使用 % 2 检查数字是否可被整除来检查数字是偶数或奇数 二。这是定义(正数,整数(数字的另一种方法 是偶数或奇数:

  • 零是偶数。
  • 一个是奇怪的。
  • 对于任何其他数字 N,其偶数与 N - 2 相同。

定义一个递归函数甚至对应于此描述。 该函数应接受数字参数并返回布尔值。

在 50 和 75 上进行测试。看看它在 -1 上的行为。为什么?你能想到吗 有什么办法可以解决这个问题吗?

这是我尝试过的,它有效:

function isEven(number) {
    if (number == 0) {
        return true;
    } else {
        return (-number % 2 == 0) ? true : false;
    }
    return isEven(number - 2);
}
console.log(isEven(-1));

但是,这似乎是一个错误的答案,因为据我了解,作者希望我使用 - 2 方法。我想知道这是否确实是正确的答案,或者如果它是错误的,有人可以指出我正确的方向。

我认为你感到困惑的原因是因为你不了解递归是如何工作的。它是 n-2 的原因是,它取数字并减去 2,直到它是零或一。因此给我们一个真假。

希望有帮助。阅读递归过程的工作原理。

下面

提供了不使用模运算符%或JavaScript中任何其他内置函数的替代解决方案。相反,此解决方案依赖于使用另一个递归来更改数字的负值。

function isEven(number) {
    if (number < 0) {
        return isEven(-number);
    } else if (number == 1) {
        return false;
    } else if  (number == 0) {
        return true;
    } else {
        return isEven(number - 2);
    }
}
console.log(isEven(50)); // true
console.log(isEven(75)); // false
console.log(isEven(-1)); // false

我们调用isEven(数字-2(回到函数的顶部,使用最初输入的数字,但比以前少2,它会继续这样做,直到数字为1或0,然后它将能够返回布尔值true或false(偶数或奇数(。

我认为问题是在不使用mod/%/余数操作的情况下创建一个isEven函数

function isEven(number) {
  if (number < 0) {
    number = Math.abs(number);
  }
  if (number===0) {
    return true;
  }
  if (number===1) {
    return false;
  }
  else {
    number = number - 2;
    return isEven(number);
  }
}

我想添加这一点很重要

  1. 它不处理字符串
  2. 它不处理浮点数
  3. 不要将其放入生产应用程序中
function isEven(n) {
 n = Math.abs(n);
  if (n==0) 
    return true;
  else if (n==1)
    return false;
  else 
    return isEven(n-2);
}
console.log(isEven(-50)); // → true
console.log(isEven(75)); // → false
console.log(isEven(-75)); // → false
console.log(isEven(-1)); // → false
var isEven = function(n) {
  // Get the absolute value of the number
  // so we don't have to bother with negatives
  n = Math.abs(n);
  // We know that if we subtract 2 from our number
  // until it is equal to zero, our number was even
  // If our number isn't zero, this statement will be skipped
  if(n === 0) return true;
  // We know that if we subtract 2 from our number
  // and it reaches a value of 1, it isn't even
  // If our number isn't 1, this statement will be skipped
  if(n === 1) return false;
  // We subtract 2 from our original number and pass it
  // back in to this function to check it over and over again
  // until one of the conditions is met and the function can
  // return a result
  return isEven(n - 2);
}
// We test our function here
console.log(isEven(-21));

这是我能想到的最精简的方法。请注意,我们从自身内部调用 isEven 函数,并传入 n - 2 的值。这将不断从我们的数字中减去 2 并检查它是否等于 0 或 1,直到我们得到正确的结果并返回相应的布尔值。

我希望这能澄清一点。

下面的代码怎么样?似乎对我有用。

/*if > 1 keep looking, otherwise return reverse boolean value. 
If negative value, inverse, to answer the last part of the question... 
Also needed to use parseInt as the text value I used, 
was considered a string value!
This being a recursive function which really isn't necessary, 
means that in javascript we will get a 
stack size exceeded error when the number becomes too large.*/
function isEven(x) {
    return (x>1)?isEven(x-2):(x>=0)?!x:isEven(-x);
}

本书需要以下控制台.log此类值的输出

console.log(isEven(50));
// → true
console.log(isEven(75));
// → false
console.log(isEven(-2));
// → ??

提示说:"当给定一个负数时,函数将一次又一次地递归,向自己传递一个越来越负的数字,从而越来越远离返回结果。它最终会耗尽堆栈空间并中止。 所以我不确定我得到的是否代表这一点,但我的代码和控制台.log输出如下所示:

   let isEven = function(num) {
         if (num ===0) {
             return true
         } else if (num===1){
             return false
         } else {
             return isEven(num-2)
         }
    }    
console.log(isEven(50));
// → true
console.log(isEven(75));
// → false
console.log(isEven(-2));
// → RangeError: Maximum call stack size exceeded (line 3 in function isEven)```

该问题要求您不要不使用模运算符 (%(。

// Your code here.
var isEven = function(a){
  if (a == 0){ //case 1 : zero is even
    return true;
  }
  else if(a == 1){ //case 2: one is odd 
    return false;
  }
    else {
      return isEven(Math.abs(a-2)); //solves case 3 (negative numbers)
    }
}
console.log(isEven(50));
// → true
console.log(isEven(75));
// → false
console.log(isEven(-1));
// → ?? ....false

这是网站上的"正确"答案。我在引号中说"正确",因为我不明白第二个"else if"语句的return isEven(-n)。为什么作者包括将n转换为正数的选项?

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

无论如何,以为我会分享,因为我没有看到任何人发布这个答案。

//define recursive function isEven takes a positive whole number
//returns true if even
function isEven(x) {
  //define innner function to loop over value
  function find(current) {
    //check if value == 0, return true
    if (current == 0) { 
      return true
    //check if value == 1 return false
     } else if (current == 1)  {
        return false
    //loop over value, subtracting 2 each time until either 0 or 1
    //which returns the approriate true/false value based on evenness
     } else {
     console.log(current)
     return find(current -2)
    }
  }
    return find(x)
}

如果数字是 1-1,则 ODD,该函数返回 false
如果数字为 0 因此为 EVEN,则返回 true

如果数字也不是 1,-1 也不是 0,我们必须首先检查数字是正数还是负数,

如果数字为且小于 -1,我们再次调用该函数,但将数字增加 2,直到得到 -1 或 0;
如果数字为且大于 1,我们再次调用该函数,但将数字减少 2,直到得到 1 或 0;

例如,数字是 5 ->
它是正数并且大于 1,因此一遍又一遍地调用该函数并将数字减少 2,直到结果为 0 或 1:
5->3->1//->假

    function isEven(num) {
    if (num == 1 || num == -1) {
        return false;
    } else if (num == 0) {
        return true;
    } else {
        if (num < -1) {
            return isEven(num + 2);
        } else {
            return isEven(num - 2);
        }
    }
}

测试结果:

console.log(`-35 is even: ${isEven(-35)}`); //-> false
console.log(`-1 is even: ${isEven(-1)}`);  //-> false
console.log(`0 is even: ${isEven(0)}`);  //-> true
console.log(`32 is even: ${isEven(32)}`);  //-> true

我在上面看到很多使用数学函数和模运算符的例子。但我想作者希望一个简单的递归函数能够让读者理解相同的功能,以及如果定义不当,它会导致重复的函数调用并最终导致堆栈溢出。我相信下面的这段代码可以帮助您理解:

function isEven(n){
  if(n==0){
    return true;
  } else if(n==1){
    return false;
  } else {
    return isEven(n-2);
  }
}
console.log(isEven(50));
console.log(isEven(75));
console.log(isEven(-1));

function isEven(num){
 if(num %2 == 0) {
 return true;
} else {
  return false;
 }
}
console.log(isEven(50));
// → true
console.log(isEven(75));
// → false
console.log(isEven(-1));
// → ??
function isEven(number) {
    while(number>= -1)
    {   
        return isEven(number-2) == 0 && number>-1 ? true : false;
    }
}
console.log(isEven(-1));

我希望这有帮助:

const evenOrOdd = (N) => {
    if (Math.abs(N) === 0) {
        return console.log('Even');
    } else if (Math.abs(N) === 1) {
        return console.log('Odd');
    }
    evenOrOdd(Math.abs(N) - 2);
};

谷歌浏览器控制台代码结果:

它利用了关于该问题的所有三个给定参数。它可以处理负整数。它不使用取模运算符。最后,我无法看到任何与我提供的代码片段相似的代码片段,因此我很想分享我能分享的内容。