2016-05-30 122 views
0

我用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)); 
+3

_“我用Math.abs但我失败了“_?哪里?为什么? – Rayon

+0

感谢@ÁlvaroGonzález我得到它,所以它是 - ( - 3)感谢我安慰,它的积极 –

+0

@Rayon我没有照顾负值的递归,发现了这个解决方案, –

回答

4

给你一个简单的测试用例:

> console.log(-(-3)); 
3 

这不是JavaScript的特性,它是数学的工作原理。

3

控制台与此无关。

回想一下你的数学课。 -n(-1) * n的简写表达式。如果你乘两个负数,结果是一个正数 - 而且你乘以负数1(其中正数1是乘法的同一性),结果是相同的数字,但是是正数。

由于您在检查if (n < 0)之前,你乘以-1,你总是会得到一个正数。

然而,这是几乎可以肯定不是你想要的 - 你找到的代码似乎是如何使用递归来解决共同问题的例子。在现实世界中的Javascript,你想要更多的东西是这样的:

function isEven(x) 
{ 
    return (Math.abs(x) % 2) === 0; 
} 
+0

当它被称为return isEven(-n); –

+1

我认为Luaan只是想让你明白理论上的否定是如何工作的。正在执行代码的处理器可能只是翻转负数位。 有关有符号整数表示的信息,您可以阅读https://en.wikipedia。org/wiki/Two%27s_complement – TOAOGG

+0

@GlendonPhilippBaculio这两个表达式在数学上是等价的 - 它们在CPU上不一定具有相同的实现(尽管编译器可能将两者编译为相同的指令)。 – Luaan

1

它必须是递归

让我们打破了模具!使用-1而不是2。假设一个整数;

function isEven(x) { 
    if (x === 0) return 1; // ended 
    return -1 * (isEven(Math.abs(x) - 1) ? 1 : -1) === 1; 
} 

其他有趣的方式来测试,甚至不需要2或模/ 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)); 
}