Eloquent JavaScript中有一个练习,其措辞是:
递归
我们已经看到
%(余数运算符)可以用来测试一个数是偶数还是奇数,% 2用来检查它是否可以被2整除.这是另一种定义正整数是偶数还是奇数的方法:
- 零是均匀的.
- 一个是奇怪的.
- 对于任何其他数字N,其均匀度与N-2相同.
定义
isEven与此描述相对应的递归函数.该函数应接受一个数字参数并返回一个布尔值.在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));
Run Code Online (Sandbox Code Playgroud)
当数字不是0或1时,else分支似乎工作正常; 我认为,这个问题存在于if分支机构中.
Ry-*_*Ry- 10
a < 0 ? isEven(-1 * a) : isEven( a-2);
Run Code Online (Sandbox Code Playgroud)
这条线丢失了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);
}
Run Code Online (Sandbox Code Playgroud)
但这种方式也有效:
function isEven(a) {
return a % 2 === 0;
}
Run Code Online (Sandbox Code Playgroud)
您可以扩展它以使用递归而不会使事情变得复杂,例如
function isEven(a) {
return (
a === 0 ? true :
a === 1 ? false :
a < 0 ? isEven(-a) : isEven(a - 2));
}
Run Code Online (Sandbox Code Playgroud)
因为设置r = true在?运营商实际上不是功能性的,如果是这样的点.不过,我仍然会使用它,因为它适用于±Infinity和NaN.