我正在通过 Eloquent JavaScript 学习JavaScript,其中一个练习就是编写递归函数isEven
,如果数字为偶数则返回true,如果数字为奇数则返回false 。
如果我理解正确,作者特别希望实现以下内容:
但是当我使用下面的代码时,我收到一个错误: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));
// → ??
答案 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
为了提高程序的强度,建议增加非数字决策。