an exercise in Eloquent JavaScript的措辞是:
递归
我们已经看到
%
(余数运算符)可用于测试是否 使用% 2
检查它是否可被整除,数字是偶数还是奇数 二。这是另一种定义是否为正整数的方法 偶数或奇数:
- 零是均匀的。
- 一个是奇怪的。
- 对于任何其他数字N,其均匀度与N - 2相同。
定义与此描述相对应的递归函数
isEven
。该 function应接受一个数字参数并返回一个布尔值。在50和75上测试它。看看它在-1上的表现。为什么?你能想到吗? 解决这个问题的方法?
他们提供了一个解决方案,我已经编写了一个有效的实现,但另一个总是返回undefined
;这是为什么?
var isEven = function ( a ) {
var r = false;
if ( a === 0 || a === 1 ) {
a === 0 ? r = true : r ;
return r;
} else
a < 0 ? isEven(-1 * a) : isEven(a - 2);
};
console.log(isEven(50));
当数字不是0或1时,else
分支似乎工作正常;我认为问题在于if
分支。
答案 0 :(得分:10)
a < 0 ? isEven(-1 * a) : isEven( a-2);
此行缺少return
。所以你可以这样写:
var isEven = function ( a ) {
var r = false;
if ( a === 0 || a === 1 ) {
a === 0 ? r = true : r ;
return r;
}else
return a < 0 ? isEven(-1 * a) : isEven( a-2);
}
但这种方式也有效:
function isEven(a) {
return a % 2 === 0;
}
你可以扩展它以使用递归而不会使事情变得复杂,例如。
function isEven(a) {
return (
a === 0 ? true :
a === 1 ? false :
a < 0 ? isEven(-a) : isEven(a - 2));
}
因为在r = true
运算符中设置?
实际上并不起作用,如果这是重点。不过,我仍然使用运算符,因为它适用于±Infinity和NaN。
答案 1 :(得分:6)
在else分支中需要return
语句。因为它只是评估表达式并丢弃结果。
答案 2 :(得分:3)
你有没有使用简单的奇怪支票?
var isEven = function ( a ) {
return (a % 2 === 0) ? true : false;
}
答案 3 :(得分:0)
感谢您的回答我得到了什么问题。
在递归的情况下,如果你想将基本案例的结果传递给等待响应的调用,那么使用result
是必不可少的,无论如何都不会这样做。如果案例库的调用结束时没有任何结果,您期望发生什么?什么都没有归还等等。
我学到的另一件事是你不能将result
与三元运算符一起使用。
所以,最后,一个解决方案可以是这个:
var isEven = function ( a ) {
var r = false;
if ( a === 0 || a === 1 ) {
a === 0 ? r = true : r ;
return r;
}else if ( a < 0)
return isEven(-a);
else
return isEven(a-2);
}
完美无缺。
如果有人想知道这本书提供的解决方案,那就是这个:
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);
}