我正在进行http://eloquentjavascript.net/03_functions.html的练习,并且很难理解递归练习的特定部分。练习要求根据作为参数输入的值打印true或false。
在尝试这个练习之后,我意识到我使用了错误的技术,在查看解决方案后,我很困惑第二个if if语句如何工作,检查输入的参数是否为负值。
function isEven(number){
if (number == 0){
return true;
} else if (number == 1){
return false;
} else if (number < 0){
return isEven(-number );
} else {
return isEven(number -2);
}
}
console.log(isEven(-2)); // true
console.log(isEven(-5)); // false
我对如何从自身减去负值例如return isEven(-number )
感到困惑,提供了true
或false
值。例如-5 -(-5) = 0
所以这将返回true
,但-5
不是偶数值,它是奇数。
我能否解释一下这个递归代码如何使用减去参数?
答案 0 :(得分:1)
你对-number
的作用有一点误解。这不是从自身中减去数字,而是产生数字的负数,例如-5
=&gt; 5
或2
=&gt; -2
。
我会说,这段代码有很多方法可以清理 - 第一个也是最重要的一点是,通过使用模运算符(%
来测试均匀性或奇怪性是非常容易的。 ),返回将数字除以另一个数字的余数。在这种情况下,以2为模的所有奇数整数将返回1,并且所有偶数都将返回0.这几乎在所有方面都是一种更好的方法来解决这个问题,而不是递归0.一般的经验法则 - 如果您使用高级语言进行递归以执行基本算术,则可能有一个更简单的解决方案。
答案 1 :(得分:0)
负号将负数转换为正数,这样第二个递归情况可以继续减去2,直到达到其中一个基本情况(0或1),然后告诉你它是偶数还是奇数:)