我使用了Math.abs,但是我失败了并找到了这个解决方案,我正在遵循雄辩的javascript以及如何将负值转为正值,这里是代码:
function isEven(n) {
if (n == 0) {
return true;
}
else if (n == 1) {
return false;
}
else if (n < 0) {
console.log(-n);
return isEven(-n); // turn -3 to 3?
}
else {
return isEven(n - 2);
}
}
console.log(isEven(-3));
答案 0 :(得分:4)
这是一个更简单的测试用例:
> console.log( -(-3) );
3
这不是JavaScript的特点,而是数学的工作方式。
答案 1 :(得分:3)
控制台与此无关。
回想你的数学课。 -n
是(-1) * n
的缩写表达式。如果你乘以两个负数,结果是一个正数 - 并且由于你乘以负数1(其中正数1是乘法的同一性),结果是相同的数字,但是正数。
由于您在乘以if (n < 0)
之前检查-1
,因此您将始终获得正数。
然而,这几乎绝对不是你想要的 - 你找到的代码似乎是如何使用递归来解决常见问题的一个例子。在现实世界的Javascript中,你需要更像这样的东西:
function isEven(x)
{
return (Math.abs(x) % 2) === 0;
}
答案 2 :(得分:1)
它必须是递归
让我们打破模具!使用-1
代替2
。假设一个整数;
function isEven(x) {
if (x === 0) return 1; // ended
return -1 * (isEven(Math.abs(x) - 1) ? 1 : -1) === 1;
}
其他有趣的测试方法,即使不需要2
或mod / remaineder
function isEven(x) {
return Math.round(Math.sin(5 * x / Math.PI)) === 0;
}
O(log n)
递归
function isEven(x, a) {
if (!a) a = [true, false];
if (a.length > x) return a[x];
return isEven(x, a.concat(a));
}