雄辩的JavaScript 2nd Edition递归练习解决方案
Eloquent JavaScript 2nd Edition recursion exercise solution
我试图解决在线书籍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);
}
}
我想添加这一点很重要
- 它不处理字符串
- 它不处理浮点数
- 不要将其放入生产应用程序中
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);
};
谷歌浏览器控制台代码结果:
它利用了关于该问题的所有三个给定参数。它可以处理负整数。它不使用取模运算符。最后,我无法看到任何与我提供的代码片段相似的代码片段,因此我很想分享我能分享的内容。
- 数组在递归方法中设置为null
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 递归使用 eval() 是检查程序执行的好方法吗?
- 使用递归、Ramda.js和无点样式重构字符串的getPermutations()
- 递归深度比较
- Eloquent JavaScript递归示例如何终止为返回1,但仍然输出指数值
- 递归函数中断
- 如何递归地获取嵌套对象中所有子对象的列表
- JavaScript 素数搜索无限递归
- 在递归生成器函数中,yield后面的*(星号/星号)语法意味着什么
- 递归|两个函数名
- 有没有一种方法可以在Javascript中进行可变递归currying
- 如何对不同的表递归使用以下代码
- 将jQuery对象传递到setTimeout递归函数中
- 有更好的方法吗?(递归解析HTML unicode实体)
- 为什么递归生成器函数没有't在ES2015工作
- 使用递归实现加性持久性
- 递归显示n元树
- "Eloquent Javascript“;递归练习
- 雄辩的JavaScript 2nd Edition递归练习解决方案